zoukankan      html  css  js  c++  java
  • JSON 之 SuperObject(8): 关于乱码的几种情况 向 Henri Gourvest 大师报告


    这几天学习 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:\Temp\Test.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:\Temp\Test.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":"\u7b80\u4f53\u4e2d\u6587"}
    
      stream.Position := 0;
      jo := TSuperObject.ParseStream(stream);
      ShowMessage(jo.AsString);           //{"Language" : "简体中文"}
    
      stream.Free;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    const
      FilePath = 'C:\Temp\Test.txt';
    var
      jo: ISuperObject;
    begin
      jo := SO('{"Language" : "简体中文"}');
      jo.SaveTo(FilePath, False, True);
    
      with TStringList.Create do
      begin
        LoadFromFile(FilePath);
        ShowMessage(Text);      // {"Language":"\u7b80\u4f53\u4e2d\u6587"}
        Free;
      end;
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    var
      jo: ISuperObject;
      stream: TStream;
    begin
      stream := TStringStream.Create('{"Language":"\u7b80\u4f53\u4e2d\u6587"}');
    
      jo := TSuperObject.ParseStream(stream);
      ShowMessage(jo.AsJSon(False, False));   // {"Language" : "简体中文"}
    
      stream.Free;
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    const
      FilePath = 'C:\Temp\Test.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.
    
  • 相关阅读:
    xyplorer设置备忘
    如何在CentOS 8上安装Python2 Python3
    为CentOS 8操作系统安装MySQL的方法,以安装MySQL 8为例
    SSH登录服务器报ECDSA host key "ip地址" for has changed and you have requested strict checking
    Linux常用命令大全
    转载:php的几种常用的数据交换格式
    转:GBK编码 VS UTF8编码
    转载:中文在UTF8和GBK编码中的范围
    转:SDL Specification and Description Language 简介
    转:Java中Split函数的用法技巧
  • 原文地址:https://www.cnblogs.com/del/p/1589299.html
Copyright © 2011-2022 走看看