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.
    
  • 相关阅读:
    如何查看linux端口被哪个进程占用
    Beego 结合 GORM 操作 Mysql 数据库
    Linux Go proxy 设置
    working directory is not part of a module
    依赖注入 gin项目的目录结构说明
    详解django中使用定时任务的方法
    input 原声上传文件 file转化为binary对象发送给后台
    vue篇之事件总线(EventBus)
    小程序路由遇到的问题(eventChannel.emit is not a function报错)
    小程序组件(弹窗组件以及插槽使用)
  • 原文地址:https://www.cnblogs.com/del/p/1589299.html
Copyright © 2011-2022 走看看