Главная страница
    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.05 c
15-1165527175
Mr. D
2006-12-08 00:32
2006.12.31
Как заставить TMediaPlayer показывать видео на весь экран?


15-1165871692
Cyrax
2006-12-12 00:14
2006.12.31
Таинственное исчезновение ветки "Разбор XML средствами C++ и C#"


15-1165484004
Strate
2006-12-07 12:33
2006.12.31
Нда... Прослушка компов всего мира..


9-1141156965
Просто_Я
2006-02-28 23:02
2006.12.31
Почему такой код в DelphiX не работает?


15-1165911636
zdm
2006-12-12 11:20
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский