日语本地化中的TStringStream问题

时间:2017-11-21 14:57:23

标签: delphi unicode ansi

我有以下设置:
- Windows系统语言为英语 - 我使用Delphi 10.1 Berlin - 在Windows Region&语言/国家/地区设置为日本 - 设置为日语(日本)的非Unicode程序的区域/管理/语言。

我使用字符串实现了通信客户端/服务器 我们暂时跳过“为什么不是字节”的问题。我想展示问题并找出原因。

我在TStringStream中写了2件事:

  1. 标题:包括Int64的大小(8个字节),Int64的对象大小(8个字节)和类名:标题长度 - 2 * SizeOf(Int64)。
  2. object(TComponent descendant)
  3. 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个问题:

    1. 如果我没有在TStringStream的构造函数中明确指定TEncoding.Unicode编码,那么将使用TEncoding.Default。但对于日语代码页,它是ANSII,对于英语,它是Unicode。结果是我稍后阅读的对象尺寸

      SS.Read(OL, SizeOf(OL));
      

      错了。 这是要比较的二进制文件。请参阅8-15个字节Click

    2. 好的,问题1已解决,但我保存的用于验证的二进制文件仍与原始二进制文件不匹配:最后缺少1个字节。

    3. 有人能说出问题出在哪里吗?
      重要提示:如果我有英语本地化,就没有问题!

0 个答案:

没有答案