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:

Was mache ich falsch?

War es hilfreich?

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top