我有以下设置:
- Windows系统语言为英语
- 我使用Delphi 10.1 Berlin
- 在Windows Region&语言/国家/地区设置为日本
- 设置为日语(日本)的非Unicode程序的区域/管理/语言。
我使用字符串实现了通信客户端/服务器 我们暂时跳过“为什么不是字节”的问题。我想展示问题并找出原因。
我在TStringStream中写了2件事:
procedure ComponentToStream(AComponent: TComponent; AStream: TStream; out HL,OL: Int64);
var
CN: TBytes;
MS1: TMemoryStream;
begin
MS1 := TMemoryStream.Create;
try
CN := TEncoding.Unicode.GetBytes(AComponent.ClassName);
SaveComponentToStream(MS1, AComponent);
OL := MS1.Size;
MS1.Position := 0;
HL := SizeOf(HL) + SizeOf(OL) + Length(CN);
AStream.Write(HL,SizeOf(HL));
AStream.Write(OL,SizeOf(OL));
AStream.Write(CN[0], Length(CN));
MS1.SaveToStream(AStream);
finally
FreeAndNil(MS1);
end;
end;
function PrepareDataBeforeSend(Component: TComponent): string;
var
HL, OL: Int64;
SS: TStringStream;
begin
SS := TStringStream.Create('', TEncoding.Unicode);
try
ComponentToStream(Component, SS, HL, OL);
Result := SS.DataString;
SS.SaveToFile('Orginal stream data.debug');
finally
FreeAndNil(SS);
end;
此方法的结果保存在此处的文件中 click
要在上面调用上面的代码之后验证我使用下面代码的数据。
SS := TStringStream.Create({PrepareDataBeforeSend result}, TEncoding.Unicode);
SS.SaveToFile('New stream data.debug');
SS.Free;
可在此处找到已保存的二进制文件Click
现在有2个问题:
如果我没有在TStringStream的构造函数中明确指定TEncoding.Unicode编码,那么将使用TEncoding.Default。但对于日语代码页,它是ANSII,对于英语,它是Unicode。结果是我稍后阅读的对象尺寸
SS.Read(OL, SizeOf(OL));
错了。 这是要比较的二进制文件。请参阅8-15个字节Click
好的,问题1已解决,但我保存的用于验证的二进制文件仍与原始二进制文件不匹配:最后缺少1个字节。
有人能说出问题出在哪里吗?
重要提示:如果我有英语本地化,就没有问题!