3

我正在尝试使用 Delphi XE 将与我的系统(例如 Cyrillic)不同的代码页中的一些文本行保存到 TFileStream 中。但是我找不到任何代码示例来生成那些编码文件?

我尝试使用与 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;

提前致谢。

4

2 回答 2

4

不知道你在找什么例子;以下可能会有所帮助 - 该示例将 unicode 字符串 (SL) 转换为 ANSI Cyrillic:

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

begin
  CyrillicEncoding := TEncoding.GetEncoding(1251);
  try
    SL.SaveToStream(Stream, CyrillicEncoding);
  finally
    CyrillicEncoding.Free;
  end;
end;
于 2011-01-27T17:54:25.280 回答
2

如果我理解这很简单。声明一个与 Cyrillic 1251 相关的 AnsiString:

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 编码的文本文件应该没有 BOM。

于 2011-01-27T17:23:33.773 回答