Главная страница
    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.48 MB
Время: 0.047 c
15-1165492871
PHPDeveloper
2006-12-07 15:01
2006.12.31
HTML


15-1165946715
GanibalLector
2006-12-12 21:05
2006.12.31
Контр.сумма по модулю 2


15-1165999792
ocean
2006-12-13 11:49
2006.12.31
Перегнать фильм с камеры на DVD


15-1165432569
tesseract
2006-12-06 22:16
2006.12.31
Кто курит трубку?


6-1154989722
Rembo
2006-08-08 02:28
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский