• JSON 之 SuperObject(8): 关于乱码的几种情况


    这几天学习 JSON - SuperObject, 非常幸运地得到了其作者 Henri Gourvest 大师的同步指点! (Henri 大师也是 DSPack 和 GDI+ 头文件的作者; 大师是法国人, 竟能用中文给我回复, 没想到!).

    学习中发现 SuperObject 有些地方对中文(或者说 Unicode)支持不是所期望的, 现在专贴提出来供大师鉴别.

    以下例子都会出现乱码, 虽然都可以有变通的方案, 但如果不乱码就太好了!


    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses SuperObject;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      jo: ISuperObject;
      stream: TStream;
    begin
      stream := TMemoryStream.Create;
    
      jo := SO('{"Language" : "简体中文"}');
      jo.SaveTo(stream, False, False);
    
      stream.Position := 0;
      Memo1.Lines.LoadFromStream(stream); // {"Language":"€S-?}
    
      stream.Free;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    const
      FilePath = 'C:TempTest.txt';
    var
      jo: ISuperObject;
    begin
      jo := SO('{"Language" : "简体中文"}');
      jo.SaveTo(FilePath, False, False);
    
      with TStringList.Create do
      begin
        LoadFromFile(FilePath);
        ShowMessage(Text);      // {"Language":"€S-?}
        Free;
      end;
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    var
      jo: ISuperObject;
      stream: TStream;
    begin
      stream := TStringStream.Create('{"Language" : "简体中文"}');
    
      jo := TSuperObject.ParseStream(stream);
      ShowMessage(jo.AsJSon(False, False));   // {"Language":"¼òÌåÖÐÎÄ"}
    
      stream.Free;
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    const
      FilePath = 'C:TempTest.txt';
    var
      jo: ISuperObject;
    begin
      with TStringList.Create do
      begin
        Add('{"Language" : "简体中文"}');
        SaveToFile(FilePath);
        Free;
      end;
    
      jo := TSuperObject.ParseFile(FilePath);
      ShowMessage(jo.AsJSon(False, False));   // {"Language":"¼òÌåÖÐÎÄ"}
    end;
    
    end.


    下面是以上问题的暂时的变通方案:


    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses SuperObject;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      jo: ISuperObject;
      stream: TStream;
    begin
      stream := TMemoryStream.Create;
    
      jo := SO('{"Language" : "简体中文"}');
      jo.SaveTo(stream, False, True);
    
      stream.Position := 0;
      Memo1.Lines.LoadFromStream(stream); // {"Language":"u7b80u4f53u4e2du6587"}
    
      stream.Position := 0;
      jo := TSuperObject.ParseStream(stream);
      ShowMessage(jo.AsString);           //{"Language" : "简体中文"}
    
      stream.Free;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    const
      FilePath = 'C:TempTest.txt';
    var
      jo: ISuperObject;
    begin
      jo := SO('{"Language" : "简体中文"}');
      jo.SaveTo(FilePath, False, True);
    
      with TStringList.Create do
      begin
        LoadFromFile(FilePath);
        ShowMessage(Text);      // {"Language":"u7b80u4f53u4e2du6587"}
        Free;
      end;
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    var
      jo: ISuperObject;
      stream: TStream;
    begin
      stream := TStringStream.Create('{"Language":"u7b80u4f53u4e2du6587"}');
    
      jo := TSuperObject.ParseStream(stream);
      ShowMessage(jo.AsJSon(False, False));   // {"Language" : "简体中文"}
    
      stream.Free;
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    const
      FilePath = 'C:TempTest.txt';
    var
      jo: ISuperObject;
    begin
      with TStringList.Create do
      begin
        Add('{"Language" : "简体中文"}');
        SaveToFile(FilePath);
        Free;
      end;
    
      Memo1.Lines.LoadFromFile(FilePath);
      jo := SO(Memo1.Text);
    //  jo := TSuperObject.ParseFile(FilePath);
      ShowMessage(jo.AsJSon(False, False));   // {"Language" : "简体中文"}
    end;
    
    end.
  • 相关阅读:
    差分约束
    DevOps系列【centos 7离线安装中文版GitLab】
    Linux系列【硬盘的插入、分区、格式化、挂载】
    并发编程系列【ThreadLocal】
    Linux系列【从一台linux通过ssh登录另一台linux服务器】
    idea系列【配置git忽略文件和目录规则】
    网络编程系列【文件上传(C/S)】
    常见的问题系列【tar: Error is not recoverable: exiting now】
    网络编程系列【TCP通信原理】
    DevOps系列【Jenkinsfile+Dockerfile+nginx+vue】
  • 原文地址:https://www.cnblogs.com/cpprun/p/4787968.html
Copyright © 2020-2023  润新知