1

我一直在使用 superobject 来满足我所有的 json 解析需求,今天我遇到了一个我似乎无法解决的问题。我下载了一个 json 文件,其中有一个看起来像这样的条目:"place" : "café"当我尝试解析文件并在消息框中显示它时,单词café变成了这样:café这告诉我存在某种转换失败关于何时使用超级对象解析文件,所以在我在这个库中投入更多时间之前,我想知道它是否支持 UTF-8,如果支持,我将如何启用它。

顺便说一句,我用来解析文件的伪代码如下所示:

uses 
SuperObject
...

const
jsonstr = '{ "Place" : "café" }';
...

var
  SupOB : ISuperObject;
begin
  SupOB := SO(jsonstr);
  ShowMessage(SupOB['Place'].AsString);
end;

转换是否因为我将对象转换为字符串而失败?我也尝试使用AsJson它来查看这是否会产生任何影响,但它没有,所以我不确定需要什么才能使这些对象按预期显示,并希望得到一些帮助。最后,我检查并验证了正在解析的原始文件确实编码为 UTF-8。

4

2 回答 2

1

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

于 2014-08-26T01:13:39.550 回答
0

读写文件json编码utf8。在德尔福 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 。

于 2015-03-06T14:02:50.503 回答