Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Win to Dos, Unicode..   Найти похожие ветки 

 
pathfinder ©   (2006-12-12 11:11) [0]

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


 
Dmitrij_K   (2006-12-12 11:18) [1]


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

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


 
pathfinder ©   (2006-12-12 11:24) [2]


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


Спасибо)


 
pathfinder ©   (2006-12-12 11:34) [3]

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


 
Dmitrij_K   (2006-12-12 11:41) [4]

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


 
Dmitrij_K   (2006-12-12 11:42) [5]

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


 
pathfinder ©   (2006-12-12 12:03) [6]

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

?


 
pathfinder ©   (2006-12-12 12:05) [7]

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


 
pathfinder ©   (2006-12-12 12:10) [8]

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 раза больше..


 
Virgo_Style ©   (2006-12-12 12:10) [9]

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


 
pathfinder ©   (2006-12-12 12:11) [10]

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


 
Dmitrij_K   (2006-12-12 12:12) [11]

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


 
pathfinder ©   (2006-12-12 12:25) [12]

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


 
pyJIoH ©   (2006-12-12 13:13) [13]

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


 
palva ©   (2006-12-12 13:17) [14]

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


 
pyJIoH ©   (2006-12-12 13:28) [15]

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


 
pathfinder ©   (2006-12-12 14:23) [16]

пытаюсь теперь сохранить текст в 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;

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


 
AndreyRu   (2006-12-12 14:32) [17]

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


 
pathfinder ©   (2006-12-12 14:41) [18]


> AndreyRu   (12.12.06 14:32) [17]


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


 
pyJIoH ©   (2006-12-12 14:56) [19]

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

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 15:07) [20]


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.063 c
15-1165484004
Strate
2006-12-07 12:33
2006.12.31
Нда... Прослушка компов всего мира..


2-1165911061
pathfinder
2006-12-12 11:11
2006.12.31
Win to Dos, Unicode..


15-1165527175
Mr. D
2006-12-08 00:32
2006.12.31
Как заставить TMediaPlayer показывать видео на весь экран?


2-1166116460
serko
2006-12-14 20:14
2006.12.31
В определенное время...


2-1165666026
xela
2006-12-09 15:07
2006.12.31
Передача текста в браузер