3

Delphi XEを使用して、キリル文字などのシステムとは異なるコードページのテキストを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キリル文字に変換します。

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

私が理解すれば、それは非常に簡単です。キリル文字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 に答える