![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Win to Dos, Unicode.. [D6, 2000]
pathfinder © (2006-12-12 11:11:00)Добрый день!
Подскажите, пожалуйста, как лучше реализовать такую задачку: на входе есть текстовый файл в кодировке Win, а на выходе получаем два файла в Dos и Unicode кодировках.
в случае Дос понятно..CharToOem, а вот как перекодировать в Юникод?
pathfinder (2006-12-12 15:07:00) [1]
> pyJIoH © (12.12.06 14:56) [19]
Спасибо, и у меня заработало)
Всем спасибо!
pyJIoH (2006-12-12 14:56:00) [2]как работает у меня
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 14:41:00) [3]
> AndreyRu (12.12.06 14:32) [17]
Это конечно хорошо, но мне бы в UTF8..
AndreyRu (2006-12-12 14:32:00) [4]var
Source, Dest : PChar;
begin
AnsiToOem(Source, Dest);
OemToAnsi(Source, Dest);
end;
pathfinder (2006-12-12 14:23:00) [5]пытаюсь теперь сохранить текст в 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;
к тексту в результирующем файле добавляется еще какая-то хрень и ворд определяет кодировку как китайскую(
pyJIoH (2006-12-12 13:28:00) [6]Почему нельзя?
palva (2006-12-12 13:17:00) [7]Нет, так нельзя. Нужно как-нибудь так:
buf: Word;
...
buf := $FEFF;
fs.Write(buf, 2);
pyJIoH (2006-12-12 13:13:00) [8]var
sign: array [0..1] of byte;
begin
sign[0] := $FF;
sign[1] := $FE;
FileStream.Write(sign, 2)
...
pathfinder (2006-12-12 12:25:00) [9]а sign у нас имеет тип string?, т.е. можно написать так FileStream.Write('$FF$FE', 2)?
Dmitrij_K (2006-12-12 12:12:00) [10]Cигнатура нужно чтобы программы понимали что в файле текст в unicode кодировке. Попробуй в блокноте сохранить unicode текст, блоrнот запишет в начало файла $FF$FE.
См. http://ru.wikipedia.org/wiki/Unicode раздел "Порядок байтов"
pathfinder (2006-12-12 12:11:00) [11]а для чего эта строка "FileStream.Write(sign, 2);" ?
Virgo_Style (2006-12-12 12:10:00) [12]pathfinder © (12.12.06 12:03) [6]
Этот комментарий указывает, каким должно быть содержание sign
pathfinder (2006-12-12 12:10:00) [13]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 раза больше..
pathfinder (2006-12-12 12:05:00) [14]или эти две строки взаимоисключающие?
pathfinder (2006-12-12 12:03:00) [15]а что означает
> sign=$FF$FE - сигнатура
?
Dmitrij_K (2006-12-12 11:42:00) [16]Очечатался, "File" это "FileStream"
Dmitrij_K (2006-12-12 11:41:00) [17]Попробуй так, код не проверял, но смысл такой.
FileStream.Write(sign, 2); // sign=$FF$FE - сигнатура
File.WriteBuffer(Pointer(w)^, Length(w)*2);
pathfinder (2006-12-12 11:34:00) [18]var
List: TStringList;
u : widestring;
begin
List := TStringList.Create;
List.LoadFromFile(OpenDialog1.FileName);
u := list.Text;
теперь у нас текст в переменной u в юникоде..а как его сохранить в файл?
pathfinder (2006-12-12 11:24:00) [19]
> Dmitrij_K (12.12.06 11:18) [1]
>
>
> > вот как перекодировать в Юникод?
>
> Еще проще
> a : String;
> w : WideString;
> w := a;
>
Спасибо)
Dmitrij_K (2006-12-12 11:18:00) [20]
> вот как перекодировать в Юникод?
Еще проще
a : String;
w : WideString;
w := a;