Unicode-Zeichenfolge und TStringStream
Delphi 2009 und höher verwendet unicode-Zeichenfolgen für Ihre Standard-string-Typ. Nach meinem Verständnis unicode-char ist eigentlich 16-bit-Wert oder 2-Byte (Hinweis: ich verstehe, gibt es die Möglichkeit, 3 oder 4 Byte, char, sondern wir betrachten das meistens der Fall ist). Allerdings fand ich, dass TStringStream ist nicht sehr zuverlässig zu manipulieren, diese Saiten. Zum Beispiel, TStringStream.Size-Eigenschaft gibt die Länge der Zeichenfolge, während ich denke, es sollte die Rückkehr der byte-Anzahl der enthaltenen string. Okay, Sie können es auf Ihre eigenen, aber die Sache, die wirklich verwirrt mich am meisten: TStringStream nicht Lesen oder schreiben in einen Puffer zuverlässig.
Bitte überprüfen Sie den folgenden code (es ist eine DUnit-test und schlägt immer fehl). Bitte lassen Sie mich wissen, wo das problem ist (ich war mit D2010, wenn das testen des Codes).
procedure TestTCPackage.TestStringStream;
const
cCount = 10;
cOrdMaxChar = Ord(High(Char));
var
B: Pointer;
SW, SR: TStringStream;
T: string;
i, j, k : Integer;
vStrings: array [0..cCount-1] of string;
begin
RandSeed := GetTickCount;
for i := 0 to cCount - 1 do
begin
j := Random(100) + 1;
SetLength(vStrings[i], j);
for k := 1 to j do
// fill string with random char (but no #0)
vStrings[i][k] := Char(Random(cOrdMaxChar-1) + 1);
end;
for i := 0 to cCount - 1 do
begin
SW := TStringStream.Create(vStrings[i]);
try
GetMem(B, SW.Size * SizeOf(Char));
try
SW.Read(B^, SW.Size * SizeOf(Char));
SR := TStringStream.Create;
try
SR.Write(B^, SW.Size * SizeOf(Char));
SR.Position := 0;
// check the string in the TStringStream with original value
Check(SR.DataString = vStrings[i]);
finally
SR.Free;
end;
finally
FreeMem(B);
end;
finally
SW.Free;
end;
end;
end;
Hinweis: ich habe bereits versucht, verwenden Sie eine Instanz von TMemoryStream als Vermittler von Lesen/schreiben des Puffers und verwenden CopyFrom der TStringStream zu Lesen, den Inhalt, die TMemoryStream mit gleichen fehlerhaften Effekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unicode-Zeichenfolgen sind nicht für die Speicherung von Daten; verwenden
TBytes
für, die.TStringStream
verwendet Ihr zugeordneten Codierung (dieEncoding
Eigenschaft) für die Codierung von Zeichenfolgen, die an in mitWriteString
und Decodierung von strings AuslesenReadString
oder dieDataString
Eigenschaft.Nach der Lektüre dieser Beitrag (und Dank Serg wer die Antwort auf diese Frage) und Barry Kelly ' s Antwort, ich habe das problem gefunden. TStringStream ist eigentlich mit ASCII/ansistring kodiert. Also, selbst wenn Ihr Standard-string-Typ ist unicode, es sei denn, Sie spesifically Sag es, es wird nicht die Verwendung der unicode-Codierung. Ich persönlich denke, es ist seltsam. Vielleicht für so dass es leichter zu konvertieren alten codes.
So haben Sie speziell die Codierung der TStringStream zu TEncoding.Unicode zu Bearbeiten unicode-string korrekt.
Hier ist mein modifizierter code die Pässe DUnit test:
Letzten Hinweis: Unicode beißt! 😀