我有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
这里列出的每一条建议都是如此
我究竟做错了什么?
您不需要单独的缓冲区来将字符串写入流.可能最简单的方法是将字符串编码为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的类助手,但是将它们重写为独奏程序和函数就不应该太难了.
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();