Пишет st,
В связи с переходом на 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% случаев сработает.
100%
Пишет st,
Так как string является псевдонимом класса UnicodeString, использующего UTF-16 и двухбайтные символы, то данный код будет корректно работать как в Delphi 2009, так и в предыдущих версиях, например 2007