Как использовать TEncoding в Delphi XE для сохранения текста кириллицы или ShiftJis в файл? - PullRequest
3 голосов
/ 27 января 2011

Я пытаюсь сохранить некоторые строки текста в кодовой странице, отличной от моей системы, такой как кириллица, в TFileStream с использованием Delphi XE. Однако я не могу найти пример кода для создания этих закодированных файлов?

Я пытался использовать тот же код, что и TStrings.SaveToStream, однако я не уверен, что реализовал его правильно (например, часть WriteBom) и хотел бы знать, как это будет сделано в другом месте. Вот мой код:

FEncoding := TEncoding.GetEncoding(1251);
FFilePool := TObjectDictionary<string,TFileStream>.Create([doOwnsValues]);

//...

procedure WriteToFile(const aFile, aText: string);
var
  Preamble, Buffer: TBytes;
begin
  // Create the file if it doesn't exist
  if not FFilePool.ContainsKey(aFile) then
  begin
    // Create the file
    FFilePool.Add(aFile, TFileStream.Create(aFile, fmCreate));
    // Write the BOM
    Preamble := FEncoding.GetPreamble;
    if Length(Preamble) > 0 then
     FFilePool[aFile].WriteBuffer(Preamble[0], Length(Preamble));
  end;
  // Write to the file
  Buffer := FEncoding.GetBytes(aText);
  FFilePool[aFile].WriteBuffer(Buffer[0], Length(Buffer));
end;

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 27 января 2011

Не уверен, какой пример вы ищете; может помочь следующее: пример преобразует строки Unicode (SL) в кириллицу ANSI:

procedure SaveCyrillic(SL: TStrings; Stream: TStream);
var
  CyrillicEncoding: TEncoding;

begin
  CyrillicEncoding := TEncoding.GetEncoding(1251);
  try
    SL.SaveToStream(Stream, CyrillicEncoding);
  finally
    CyrillicEncoding.Free;
  end;
end;
2 голосов
/ 27 января 2011

Если я понимаю, это довольно просто.Объявите AnsiString со сродством к кириллице 1251:

type
  // The code page for ANSI-Cyrillic is 1251
  CyrillicString = type AnsiString(1251);

Затем присвойте строку Unicode одному из них:

var
  UnicodeText: string;
  CyrillicText: CyrillicString;
....
  CyrillicText := UnicodeText;

Затем можно записать CyrillicText в поток в традиционномманера:

if Length(CyrillicText)>0 then
  Stream.WriteBuffer(CyrillicText[1], Length(CyrillicText));

Для текстового файла в кодировке ANSI не должно быть спецификации.

...