Delphi. Строку в файл и обратно.

В связи с переходом на unicode "по умолчанию" в Delphi 2009, функцию записи содержимого строки в файл необходимо немного изменить.

procedure SaveStrToFile(SrcStr: string; FileName: string);
var
  FS: TFileStream;
begin
  FS := TFileStream.Create(FileName, fmCreate);
  try
    FS.WriteBuffer(SrcStr[1], Length(SrcStr) * SizeOf(SrcStr[1]));
  finally
    FS.Free;
  end;
end;

Обратное преобразование также придется подправить аналогичным образом

function LoadStrFromFile(FileName: string): string;
var
  FS: TFileStream;
begin
  FS := TFileStream.Create(FileName, fmOpenRead);
  try
    SetLength(Result, FS.Size div SizeOf(Result[1]));
    FS.ReadBuffer(Result[1], FS.Size);
  finally
    FS.Free;
  end;
end;

Так как string является псевдонимом класса UnicodeString, использующего UTF-16 и двухбайтные символы, то данный код будет корректно работать как в Delphi 2009, так и в предыдущих версиях, например 2007, без дополнительных ухищрений вроде условной компиляции.

То же самое с использованием стандартного класса TStringStream. Приходится указывать кодировку в принудительном порядке.

procedure SaveStrToFile(SrcStr: string; FileName: string);
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create(SrcStr, TEncoding.Unicode);
  try
    Stream.SaveToFile(FileName);
  finally
    Stream.Free;
  end;
end;
 
function LoadStrFromFile(FileName: string): string;
var
  Stream: TStringStream;
begin
  Stream := TStringStream.Create('', TEncoding.Unicode);
  try
    Stream.LoadFromFile(FileName);
    Stream.Position := 0;
    Result := Stream.ReadString(Stream.Size);
  finally
    Stream.Free;
  end;
end;

Комментарии

А какая

А какая кодировка юникода используется по-умолчанию?

Нашел

Нашел подробности: http://www.codegear.com/article/38548/im...

По-моему такой код не учитывает возможную переменную длину символов в различных кодировках, хотя в реальной жизни в 99.9% случаев сработает.

Изображение пользователя Serguei_Tarassov.

100%

Так как string является псевдонимом класса UnicodeString, использующего UTF-16 и двухбайтные символы, то данный код будет корректно работать как в Delphi 2009, так и в предыдущих версиях, например 2007