我有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
>每个suggestions listed
here
我究竟做错了什么?
解决方法
您不需要单独的缓冲区来将字符串写入流.可能最简单的方法是将字符串编码为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的类帮助器,但是将其重写为一个独立的过程和函数,就像你的例子不是太难了.