Schreiben Sie eine Zeichenfolge in TFileStream in Delphi 2010
-
07-07-2019 - |
Frage
Ich habe Delphi 2007-Code, der wie folgt aussieht:
procedure WriteString(Stream: TFileStream; var SourceBuffer: PChar; s: string);
begin
StrPCopy(SourceBuffer,s);
Stream.Write(SourceBuffer[0], StrLen(SourceBuffer));
end;
Ich nenne es wie folgt aus:
var
SourceBuffer : PChar;
MyFile: TFileStream;
....
SourceBuffer := StrAlloc(1024);
MyFile := TFileStream.Create('MyFile.txt',fmCreate);
WriteString(MyFile,SourceBuffer,'Some Text');
....
Das funktionierte in Delphi 2007, aber es gibt mir eine Menge von Junk-Zeichen in Delphi 2010. Ich weiß, dass dies zu Unicode-Compliance-Probleme zurückzuführen ist, aber ich bin nicht sicher, wie das Problem zu lösen.
Hier ist, was ich versucht habe, so weit:
-
Ändern Sie den Datentyp SourceBuffer (und auch der Parameter erwartet von Wide) zu PWideChar
-
Jeder der Vorschläge aufgelistet hier
Was mache ich falsch?
Lösung
Sie benötigen keinen separaten Puffer einen String in einen Stream zu schreiben. Wahrscheinlich ist der einfachste Weg, es zu tun ist, um die Zeichenfolge zu UTF8 zu kodieren, etwa so:
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;
Ich habe für TStream TStreamEx als Klasse Helfer erklärt, aber es sollte nicht allzu schwierig sein, diese als Solo-Prozedur und Funktion wie Ihr Beispiel neu zu schreiben.
Andere Tipps
Delphi 2010 hat eine schöne Lösung für dieses, dokumentiert hier:
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();