Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Сохранение в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
2-1256574396
Dragon-zla
2009-10-26 19:26
2009.12.13
Длина столбца


2-1256215062
Ивутин П.
2009-10-22 16:37
2009.12.13
Поиск TColumnEh по заголовку


15-1255699290
ocean
2009-10-16 17:21
2009.12.13
Посоветуйте бесплатный antispy для windows 2003 server?


1-1228251529
Dimon Dimonich
2008-12-02 23:58
2009.12.13
Построение пространства из точек.


15-1255252664
Kerk
2009-10-11 13:17
2009.12.13
Украсть ящик водки, продать его, а полученные деньги пропить.