码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2015-09-07 09:36:14      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

这几天学习 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.

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

标签:

原文地址:http://www.cnblogs.com/wuyujie/p/4787968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!