Главная страница
    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.045 c
15-1163167195
Empleado
2006-11-10 16:59
2006.12.31
Любителям английского


2-1165914539
WhiteBarin
2006-12-12 12:08
2006.12.31
Как узнать имя текущего пользователя и его логин


1-1163459204
Morrison
2006-11-14 02:06
2006.12.31
Кто знаком с KAZip? Не получаются элементарные вещи... :(


3-1161084645
safo
2006-10-17 15:30
2006.12.31
Как трассировать sql-запросы к ODBC?


4-1156150573
Alita
2006-08-21 12:56
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский