SuperObject是否支持UTF-8

时间:2014-08-26 01:01:08

标签: json delphi utf-8 superobject

我一直在使用superobject来满足我所有的json解析需求,今天我遇到了一些我似乎无法解决的问题。我下载了一个json文件,里面有一个类似于"place" : "café"的条目,当我尝试解析文件并在消息框中显示时,café这个词就像这样:{{1这告诉我在使用superobject解析文件时会发生某种转换失败,所以在我再投入这个库之前,我想知道它是否支持UTF-8,如果支持,如何我会继续启用吗。

BTW,我用来解析文件的伪代码如下所示:

café

转换是否失败,因为我将对象转换为字符串?我也尝试使用uses SuperObject ... const jsonstr = '{ "Place" : "café" }'; ... var SupOB : ISuperObject; begin SupOB := SO(jsonstr); ShowMessage(SupOB['Place'].AsString); end; 来查看是否会产生任何影响,但事实并非如此,我不确定需要什么才能使这些对象显示为预期,并希望得到一些帮助。最后,我检查并验证了正在解析的原始文件确实编码为UTF-8。

2 个答案:

答案 0 :(得分:1)

您说您正在解析文件,但您的示例是解析字符串。这会产生很大的不同,因为如果您首先将文件数据读入字符串,则可能无法正确读取文件数据。请记住,Delphi字符串在Delphi 2009及更高版本中使用UTF-16,但在早期版本中使用ANSI。无论哪种方式,不是UTF-8。因此,如果您的输入文件是UTF-8编码,则必须先将其数据解码为正确的字符串编码,然后再进行解析。 cafécafé的UTF-8编码形式被误解为ANSI。

答案 1 :(得分:0)

读取和写入json编码的文件utf8。在Delphi 2007上测试过。

function ReadSO(const aFileName: string): ISuperObject;
var
  input: TFileStream;
  output: TStringStream;
begin
  input := TFileStream.Create(aFileName, fmOpenRead, fmShareDenyWrite);
  try
     output := TStringStream.Create('');
     try
       output.CopyFrom(input, input.Size);
       Result := TSuperObject.ParseString(PWideChar(UTF8ToUTF16(output.DataString)), true, true);
     finally
       output.Free;
     end;

  finally
    input.Free;
  end;
end;

procedure WriteSO(const aFileName: string; o: ISuperObject);
var
  output: TFileStream;
  input: TStringStream;
begin
  input := TStringStream.Create(UTF16ToUTF8(o.AsJSon(true)));
  try
     output := TFileStream.Create(aFileName, fmOpenWrite or fmCreate, fmShareDenyWrite);
     try
       output.CopyFrom(input, input.Size);
     finally
       output.Free;
     end;
  finally
    input.Free;
  end;
end;

来自单元JclConversions http://sourceforge.net/projects/jcl/的UTF8ToUTF16和UTF16ToUTF8函数。