16

次のような Delphi 2007 コードがあります。

procedure WriteString(Stream: TFileStream; var SourceBuffer: PChar; s: string);
begin
  StrPCopy(SourceBuffer,s);
  Stream.Write(SourceBuffer[0], StrLen(SourceBuffer));
end;

私はそれを次のように呼びます:

var
  SourceBuffer : PChar;
  MyFile: TFileStream;

....

SourceBuffer := StrAlloc(1024);
MyFile := TFileStream.Create('MyFile.txt',fmCreate);
WriteString(MyFile,SourceBuffer,'Some Text');
....

これは Delphi 2007 では機能しましたが、Delphi 2010 では大量のジャンク文字が表示されます。これは Unicode 準拠の問題によるものであることはわかっていますが、この問題に対処する方法がわかりません。

これが私がこれまでに試したことです:

  • SourceBuffer のデータ型 (および WideString で必要なパラメーター) を PWideChar に変更します。

  • ここにリストされているすべての提案

私は何を間違っていますか?

4

2 に答える 2

19

文字列をストリームに書き込むために別のバッファは必要ありません。おそらく最も簡単な方法は、次のように文字列を UTF8 にエンコードすることです。

procedure TStreamEx.writeString(const data: string);
var
   len: cardinal;
   oString: UTF8String;
begin
   oString := UTF8String(data);
   len := length(oString);
   self.WriteBuffer(len, 4);
   if len > 0 then
      self.WriteBuffer(oString[1], len);
end;

function TStreamEx.readString: string;
var
   len: integer;
   iString: UTF8String;
begin
   self.readBuffer(len, 4);
   if len > 0 then
   begin
      setLength(iString, len);
      self.ReadBuffer(iString[1], len);
      result := string(iString);
   end;
end;

TStreamEx を TStream のクラス ヘルパーとして宣言しましたが、これらを単独の手順として書き直して、例のように機能させることはそれほど難しくありません。

于 2009-09-16T18:08:15.467 に答える
16

Delphi 2010 には、これに対する優れたソリューションがあり、ここに文書化されています。

http://docwiki.embarcadero.com/CodeExamples/en/StreamStrRdWr_%28Delphi%29

var
  Writer: TStreamWriter;
...

  { Create a new stream writer directly. }
  Writer := TStreamWriter.Create('MyFile.txt', false, TEncoding.UTF8);
  Writer.Write('Some Text');

  { Close and free the writer. }
  Writer.Free();
于 2009-11-11T00:59:45.263 に答える