gpt4 book ai didi

delphi - Unicode 字符串和 TStringStream

转载 作者:行者123 更新时间:2023-12-03 14:52:16 27 4
gpt4 key购买 nike

Delphi 2009 及更高版本使用 unicode 字符串作为默认字符串类型。据我了解,unicode char 实际上是 16 位值或 2 个字节(注意:我知道可能有 3 或 4 字节字符,但让我们考虑最常见的情况)。但是我发现 TStringStream 操作这个字符串不是很可靠。例如,TStringStream.Size 属性返回字符串的长度,而我认为它应该返回所包含字符串的字节数。好吧,你可以自己调整它,但真正让我困惑的是:TStringStream 不能可靠地读取或写入缓冲区。

请检查以下代码(这是 DUnit 测试,总是失败)。请告诉我问题出在哪里(我测试代码时使用的是D2010)。

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;

注意:我已经尝试使用 TMemoryStream 的实例作为读取/写入缓冲区的中介,并使用 TStringStream 的 CopyFrom 读取该 TMemoryStream 的内容,但效果相同。

最佳答案

Unicode 字符串不用于数据存储;为此使用 TBytesTStringStream 使用其关联的编码(Encoding 属性)对通过 WriteString 传入的字符串进行编码,并对通过 ReadString< 读出的字符串进行解码DataString 属性。

关于delphi - Unicode 字符串和 TStringStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3906847/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com