这几天学习 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 := ;
  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 := ;
  Memo1.Lines.LoadFromStream(stream); // {"Language":"\u7b80\u4f53\u4e2d\u6587"}

  stream.Position := ;
  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.

JSON 之 SuperObject(8): 关于乱码的几种情况 - 向 Henri Gourvest 大师报告的更多相关文章

  1. 【乱码】Request QueryString 编码,传值乱码的几种情况和解决办法(单页,多页)

    自己的项目还好,合作接口神马的传值乱码是很常见的. 遇到了几次这种恶心情况,积累了一点经验,有不对的地方欢迎指正. 乱码原因: 一般来说,常用的编码不是utf-8就是gb2312,一样的 HttpUt ...

  2. 怎么设置tomcat在get请求的中文也不乱码?两种情况下配置

    我们都知道,get请求和post请求的一个比较显著区别就是,在使用post请求的时候,中文不会乱码,但是在使用get请求的时候,如果url后面带有中文就会乱码了.那么这个怎么解决呢? 前提:配置项目的 ...

  3. JSON 之 SuperObject(1)

    一直盼着 Delphi 能够直接支持 "正则表达式" 与 "JSON"; Delphi 2009 刚来的时候, 有了 JSON, 但不好, 那时尝试过一点. 这 ...

  4. JSON 之 SuperObject(11): TSuperTableString、TSuperAvlEntry

    JSON 之 SuperObject(11): TSuperTableString.TSuperAvlEntry - 万一 - 博客园http://www.cnblogs.com/del/archiv ...

  5. 解决springboot序列化 json数据到前端中文乱码问题

    前言 关于springboot乱码的问题,之前有文章已经介绍过了,这一篇算是作为补充,重点解决对象在序列化过程中出现的中文乱码的问题,以及后台报500的错误. 问题描述 spring Boot 中文返 ...

  6. pythonl输出的预警消息中的json串的中文展示乱码(中文的unicode码)

    来源:ctrip接口名称:ReviewStandartAPI错误信息:[{'ReviewTime': u'\u63a5\u53e3\u8fd4\u56de\u7684\u70b9\u8bc4\u65f ...

  7. Get请求中文乱码的几种解决方式

    1.将字符串转码:new String("xxxxx".getBytes("iso-8859-1"),"utf-8")         这种 ...

  8. 关于遍历javascript 中的json串浏览器输出的结果不统一的情况

    我们在做项目的时候经常会用到javascript的json. 首先说一下javascript的json串是什么,json串属于javascript的一个对象,有键和值对应的对象. 一般的格式是: a ...

  9. 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略

    昨天在爬取电影的时候生成的表单打开result.html时,发现页面出现如下乱码: 第一种方法: 上网找了半天,网上的解决方案是这样的: 1.Win + R输入gpedit.msc打开组策略编辑器; ...

随机推荐

  1. 系统使用 aspose.cell , 使得ashx第一次访问会变很慢

      网站放在IIS后, 在网站第一次访问后.  回收应用程序池 第一次访问aspx页面还是比较快.   但第一次访问ashx会很慢.   后发现原因: aspose.cell的5.3...版本. 的原 ...

  2. PE文件结构学习

    PE:Portable Executable File Format(可移植的执行体).Windows平台主流可执行文件格式..exe与.dll文件都是PE格式.32位的叫做PE32,64位的叫做PE ...

  3. Linux配置防火墙,开启80端口、3306端口(转)

    vi /etc/sysconfig/iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(允许80端口通过防火 ...

  4. 从浏览器的console获取angularjs的scope

    http://ionicframework.com/blog/angularjs-console/ 1: Access Scopes We can access any scope (even iso ...

  5. Static、final、abstract、接口、构造方法及java语法总结

    Static:定义类的时候一般不用static来修饰,在一定意义上,用static修饰的字段可以作为全局变量,static修饰的字段和方法存储在类的内存区域,所有实例共享.static字段和方法都是属 ...

  6. POJ 1305 Fermat vs. Pythagoras (毕达哥拉斯三元组)

    设不定方程:x^2+y^2=z^2若正整数三元组(x,y,z)满足上述方程,则称为毕达哥拉斯三元组.若gcd(x,y,z)=1,则称为本原的毕达哥拉斯三元组. 定理:正整数x,y,z构成一个本原的毕达 ...

  7. robotframework 测试工具添加PDF文件内容匹配插件

    robotframework  这个需要了解的请度娘.本文实现的是一个小功能.大体分为如下几个步骤 1)给定一个pdf文件. 2)读取pdf文件内容,并解析为文本内容. 3)通过给定的内容,比对pdf ...

  8. Quant面试准备5本书

    Heard on The Street: Quantitative Questions from Wall Street Job Interviews - Timothy Falcon Crack F ...

  9. QTP 参数化

    PS:方法内容是转的别人的,我们项目中只用到了方法三,主要用于将测试数据与业务分离,增强测试数据的可维护性. 方法一.DataTable方法 这是QTP提供的一种方法,也是最容易实现参数化的一种方式. ...

  10. C# winform post请求数据

    刚到公司混的时候,老板要求实现一个从C#的windows应用程序传参数到一个网页,然后这个网页不显示出来,但能把数据返回给应用程序的功能,问了好多人,找了好多资料,都搞不定,后来还是在老板的帮助下搞定 ...