Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.041 c
1-1163424580
DVM
2006-11-13 16:29
2006.12.31
Помогите с выбором предка для класса. Как сделать такое?


15-1165867511
Handle
2006-12-11 23:05
2006.12.31
TrayBar


1-1163508605
Axis_of_Evil
2006-11-14 15:50
2006.12.31
TListBox: Items разной высоты


9-1138054512
Аццкий_рыцарь:)
2006-01-24 01:15
2006.12.31
Редактор карт в DelphiX


9-1140729801
Kolan
2006-02-24 00:23
2006.12.31
Пытаюсь вспомнить как называлась игра, которую тут представляли..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский