当我使用SuperObject解析字符串时,为什么会出现大量问号?

时间:2013-09-20 11:39:46

标签: json delphi superobject

我正在尝试使用Delphi 7中的SuperObject解析此字符串。

procedure TForm1.btn1Click(Sender: TObject);
var
 obj: ISuperObject;
 fw:string;
begin
  fw:= '{"type":"normal","info":{"Name":"frank","Number":"01","Age":"21","registered":"Yes","Support":"Expired"}}';
  obj := TSuperObject.ParseString(PWideChar(fw), false);
  mmo1.lines.Add(obj.AsJSon(true,false));
end;

但是备忘录的结果是这样的:

  

“?????????????????????????????????????????????? ??????}“

我做错了什么?

2 个答案:

答案 0 :(得分:3)

fw是一个字符串,在Delphi 7中是8位ANSI编码。因此,施放到PWideChar是不正确的。它会将8位文本视为UTF-16编码。

如果您正在呼叫的功能确实接收到PWideChar,那么您需要先转换为UTF-16。例如:

PWideChar(WideString(fw))

您还会报告超级目标代码中出现的单独问题。特别是这行代码:

h := h*129 + ord(k[i]) + $9e370001;

引发溢出错误。

发生这种情况是因为你的项目启用了溢出检查选项(这样做的好习惯),但超级目标代码是在假设选项被禁用的情况下编写的。这实际上是超级目标代码中的一个缺陷。您可以通过添加{$OVERFLOWCHECKS OFF}来禁用超级目标代码中的溢出检查来解决此问题。理想情况下,对于故意溢出的代码,这将在本地禁用。但是,除非您完全理解代码,否则可能更容易将{$OVERFLOWCHECKS OFF}填充到设备顶部并继续前进。

现在,我正在查看最新的超级对象代码,并且位于设备顶部的是{$OVERFLOWCHECKS OFF}。所以我想知道你是否正在使用过时的代码版本。从回购中提取最新版本。

答案 1 :(得分:2)

我在delphi 7中使用SuperObjects1.2.4时遇到了同样的问题。正如很多人所说,解决方案是:获取最新版本。因此,要从存储库中获取最新的SuperObjects版本,请执行以下操作:  1.安装git(http://git-scm.com/)  2.右键单击某个文件夹,选择“Git bash”并粘贴以下内容

git clone https://code.google.com/r/steve-superobject/

完成!