Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];
ВнизСохранение в Unicode Найти похожие ветки
← →
Nutz (2009-10-27 18:02) [0]написал процедуру сохранения текста в файл в формате 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 в коде.
← →
Anatoly Podgoretsky © (2009-10-27 19:08) [1]> Nutz (27.10.2009 18:02:00) [0]
Все можно сократить, а заменить на TFileStream и преобразование на WS := S, если речь про честные строки.
← →
RWolf © (2009-10-27 21:33) [2]ы?
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;
← →
Nutz (2009-10-28 12:10) [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)); - вот тут явно ошибаюсь. Подскажите что не так?
← →
Anatoly Podgoretsky © (2009-10-28 12:38) [4]Обычная ошибка и Пушкин помощик, он отвечает за всех забывчивых, которые забывают установить размер буфера.
SetLength для Dest кто будет делать?
И почему - SizeOf(WideChar), а не - SizeOf(Word)
← →
Nutz (2009-10-28 12:41) [5]
> Anatoly Podgoretsky
Спасибо. Теперь все OK
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c