我一直在使用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。
答案 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函数。