【问题标题】:Delphi XE7: How can I make XSuperObject output accented characters?Delphi XE7:如何让 XSuperObject 输出重音字符?
【发布时间】:2016-02-05 14:16:30
【问题描述】:
uses
  ...
  XSuperObject;

procedure TForm1.Button1Click(Sender: TObject);
var
  Json: ISuperObject;
begin
  Memo1.Lines.Add('{"Evênements":"Noël"}');
  Json := SO('{"Evênements":"Noël"}');
  Memo1.Lines.Add(Json.AsJSON(True));
end;

此代码在 Memo1 中产生以下输出:

{"Evênements":"Noël"}
{
  "Ev\u00eanements":"No\u00ebl"
}

为什么我会在输出中得到 \u00ea 和 \u00eb,我应该怎么做才能得到正确的重音字符?

【问题讨论】:

    标签: json delphi ascii utf-16 xsuperobject


    【解决方案1】:

    根据我对代码的阅读,该库无法满足您的需求。字符串是在XSuperJSON.pas 中使用StrToUTF16 生成的,并且该函数被编码为将所有非ASCII 字符转换为您问题中观察到的反斜杠转义格式。

    从技术上讲,该函数生成 UTF-16,但这只是因为扩展为每个字符 16 位的 ASCII 是 UTF-16 的子集。我认为您应该 file an issue with the project 请求更典型的 JSON 序列化。

    您可以完全省略 ChrToUTF16 函数,并且几乎适用于所有输入。

    就 JSON 而言,您得到的输出很好。它是完全有效的 JSON,字符串将被读回以产生与您开始时相同的值。如果您不希望人类手动读取或编辑此 JSON,那么您不必担心。

    【讨论】:

    • 太棒了!在 XSuperJSON.pas 中,我刚刚注释掉了这一行:#127..#65535: Result := Result + ChrtoUTF16(Ord(Tmp^));,现在它就像我想要的那样工作。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多