我有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
我做错了什么?
答案 0 :(得分:16)
您不需要单独的缓冲区来将字符串写入流。可能最简单的方法是将字符串编码为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的类助手,但是将它们重写为独奏程序和函数应该不会太困难。
答案 1 :(得分:14)
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();