![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение в Unicode
Nutz © (2009-10-27 18:02:00)написал процедуру сохранения текста в файл в формате Unicode. Вот код:
procedure Stream_SaveToUnicodeFile(var Source: string; const FileName: string);
var
Bytes: Word;
Dest: PWideChar;
Size: Integer;
begin
with TMemoryStream.Create do
try
Bytes := $FEFF;
Write(Bytes, 2);
Size := Length(Source);
GetMem(Dest, (Size + 1) * 2);
try
ZeroMemory(Dest, (Size + 1) * 2);
StringToWideChar(Source, Dest, Size + 1);
Write(Dest^, Size * 2);
finally
FreeMem(Dest);
end;
SaveToFile(FileName);
finally
Free;
end;
end;
Помогите с оптимизацией. Что можно убрать или сократить? Сомнения возникают относительно необходимости задания position в коде.
Nutz (2009-10-28 12:41:00) [1]
> Anatoly Podgoretsky
Спасибо. Теперь все OK
Anatoly Podgoretsky (2009-10-28 12:38:00) [2]Обычная ошибка и Пушкин помощик, он отвечает за всех забывчивых, которые забывают установить размер буфера.
SetLength для Dest кто будет делать?
И почему - SizeOf(WideChar), а не - SizeOf(Word)
Nutz (2009-10-28 12:10:00) [3]
> Anatoly Podgoretsky
</I
> RWolf ©
>
спасибо.
Сделал как советовали:
procedure SaveToUnicodeFile(var Source: string; const FileName: string);
var
Header: Word;
begin
with TFileStream.Create(FileName, fmOpenWrite or fmCreate) do
try
Header := $FEFF;
Write(Header, 2);
Write(WideString(Source)[1], Length(Source) * SizeOf(WideChar));
finally
Free;
end;
end;
теперь проблемы с чтением из файла . Вот мой рабочий вариант:
procedure Stream_LoadAsUTF16BEFile(out Dest: string; const FileName: string);
var
Buf: PWideChar;
Bytes: Word;
begin
with TMemoryStream.Create do
try
LoadFromFile(FileName);
if Size < 2 then
Exit;
Read(Bytes, 2);
if Bytes <> $FEFF then
Exit;
GetMem(Buf, Size);
try
FillChar(Buf^, Size, 0);
Read(Buf^, Size - 2);
Dest := WideCharToString(Buf);
finally
FreeMem(Buf);
end;
finally
Free;
end;
end;
Опять же, хотелось бы сделать чере TFileStream. Вот что пытался:
procedure LoadFromUnicodeFile(out Dest: string; const FileName: string);
var
Header: Word;
begin
with TFileStream.Create(FileName, fmOpenRead) do
try
Read(Header, 2);
Read(Dest[1], Size - SizeOf(WideChar));
finally
Free;
end;
end;
Read(Dest[1], Size - SizeOf(WideChar)); - вот тут явно ошибаюсь. Подскажите что не так?
RWolf (2009-10-27 21:33:00) [4]ы?
procedure Stream_SaveToUnicodeFile(const Source, FileName: string);
var f:TFileStream;
begin
f:=TFileStream.Create(FileName,fmCreate);
try
f.Write(PChar('яю')^,2);
f.Write(WideString(Source)[1],Length(Source)*SizeOf(WideChar));
finally
f.Free;
end;
end;
Anatoly Podgoretsky (2009-10-27 19:08:00) [5]> Nutz (27.10.2009 18:02:00) [0]
Все можно сократить, а заменить на TFileStream и преобразование на WS := S, если речь про честные строки.