Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Win to Dos, Unicode.. [D6, 2000]


pathfinder ©   (2006-12-12 11:11:00) 

Добрый день!
Подскажите, пожалуйста, как лучше реализовать такую задачку: на входе есть текстовый файл в кодировке Win, а на выходе получаем два файла в Dos и Unicode кодировках.
в случае Дос понятно..CharToOem, а вот как перекодировать в Юникод?


pathfinder   (2006-12-12 15:07:00) [1]


> pyJIoH ©   (12.12.06 14:56) [19]

Спасибо, и у меня заработало)

Всем спасибо!


pyJIoH   (2006-12-12 14:56:00) [2]

как работает у меня

var
 Sign: array [0..2] of byte;
begin
 Sign[0] := $EF;
 Sign[1] := $BB;
 Sign[2] := $BF;
 FStream.WriteBuffer(Sign, Length(Sign));
 S := UTF8Encode(Value);
 FStream.WriteBuffer(S[1], Length(S));


FileStream.WriteBuffer(Pointer(U)^, Length(U)*2);
вот здесь вам не надо *2


pathfinder   (2006-12-12 14:41:00) [3]


> AndreyRu   (12.12.06 14:32) [17]


Это конечно хорошо, но мне бы в UTF8..


AndreyRu   (2006-12-12 14:32:00) [4]

var
 Source, Dest : PChar;
begin
 AnsiToOem(Source, Dest);
 OemToAnsi(Source, Dest);
end;


pathfinder   (2006-12-12 14:23:00) [5]

пытаюсь теперь сохранить текст в UTF-8
код следующий:
var
 List       : TStringList;
 W          : WideString;
 U          : UTF8String;
 FileStream : TFileStream;
 sign       : array [0..2] of byte;
begin
 List := TStringList.Create;
 sign[0] := $EF; sign[1] := $BB; sign[2] := $BF;

 try
   List.LoadFromFile(FileIn);
   W := List.Text;
   U := UTF8Encode(W);
 finally
   List.Free;
 end;

 try
   FileStream := TFileStream.Create(FileOut, fmCreate);
   FileStream.Write(sign, 3);
   FileStream.WriteBuffer(Pointer(U)^, Length(U)*2);
 finally
   FileStream.Free;
 end;

к тексту в результирующем файле добавляется еще какая-то хрень и ворд определяет кодировку как китайскую(


pyJIoH   (2006-12-12 13:28:00) [6]

Почему нельзя?


palva   (2006-12-12 13:17:00) [7]

Нет, так нельзя. Нужно как-нибудь так:
 buf: Word;
...
 buf := $FEFF;
 fs.Write(buf, 2);


pyJIoH   (2006-12-12 13:13:00) [8]

var
 sign: array [0..1] of byte;
begin
 sign[0] := $FF;
 sign[1] := $FE;
 FileStream.Write(sign, 2)
...


pathfinder   (2006-12-12 12:25:00) [9]

а sign у нас имеет тип string?, т.е. можно написать так FileStream.Write('$FF$FE', 2)?


Dmitrij_K   (2006-12-12 12:12:00) [10]

Cигнатура нужно чтобы программы понимали что в файле текст в unicode кодировке. Попробуй в блокноте сохранить unicode текст, блоrнот запишет в начало файла $FF$FE.
См. http://ru.wikipedia.org/wiki/Unicode раздел "Порядок байтов"


pathfinder   (2006-12-12 12:11:00) [11]

а для чего эта строка "FileStream.Write(sign, 2);" ?


Virgo_Style   (2006-12-12 12:10:00) [12]

pathfinder ©   (12.12.06 12:03) [6]
Этот комментарий указывает, каким должно быть содержание sign


pathfinder   (2006-12-12 12:10:00) [13]

List := TStringList.Create;
   FileOut := ChangeFileExt(OpenDialog1.FileName, '.out');
   List.LoadFromFile(OpenDialog1.FileName);
   w := list.Text;

   try
     FileStream := TFileStream.Create(FileOut, fmCreate);
     FileStream.WriteBuffer(Pointer(w)^, Length(w)*2);
   finally
     FileStream.Free;
   end;

код вроде работает..если верить ворду кодировка действительно юникод и размер файла в 2 раза больше..


pathfinder   (2006-12-12 12:05:00) [14]

или эти две строки взаимоисключающие?


pathfinder   (2006-12-12 12:03:00) [15]

а что означает
> sign=$FF$FE - сигнатура

?


Dmitrij_K   (2006-12-12 11:42:00) [16]

Очечатался, "File" это "FileStream"


Dmitrij_K   (2006-12-12 11:41:00) [17]

Попробуй так, код не проверял, но смысл такой.
 
FileStream.Write(sign, 2); // sign=$FF$FE - сигнатура
File.WriteBuffer(Pointer(w)^, Length(w)*2);


pathfinder   (2006-12-12 11:34:00) [18]

var
 List: TStringList;
 u   : widestring;
begin
   List := TStringList.Create;
   List.LoadFromFile(OpenDialog1.FileName);
   u := list.Text;
теперь у нас текст в переменной u в юникоде..а как его сохранить в файл?


pathfinder   (2006-12-12 11:24:00) [19]


> Dmitrij_K   (12.12.06 11:18) [1]
>
>
> > вот как перекодировать в Юникод?
>
> Еще проще
> a : String;
> w : WideString;
> w := a;
>


Спасибо)


Dmitrij_K   (2006-12-12 11:18:00) [20]


> вот как перекодировать в Юникод?

Еще проще
a : String;
w : WideString;
w := a;


Наверх

Титульная страница Поиск, карта сайта Написать письмо