【问题标题】:Standard way of Serializing utf-8 characters in a JSON String在 JSON 字符串中序列化 utf-8 字符的标准方法
【发布时间】:2019-04-05 14:04:34
【问题描述】:

在 JSON 中序列化 utf-8 字符串的标准方法是什么?它应该是你的转义序列还是应该是十六进制代码。

我想用 JSON 格式的单位序列化一些传感器读数。

例如,我有单位为°C 的温度读数。是否应该序列化为

{
 "units": "\u00b0"
}
´´´
or should it be something like 
´´´
{
 "units":"c2b0"
}

或者这些都可以被标准支持。

【问题讨论】:

    标签: c++ json c++11 utf-8 jsoncpp


    【解决方案1】:

    如果 JSON 用于交换数据,它必须使用 UTF-8 编码(请参阅RFC8259)。不再允许使用 UTF-16 和 UTF-32 编码。所以没有必要转义度数字符。我强烈建议不要不必要地逃避。

    正确推荐

    {
      "units": "°C"
    }
    

    当然,您必须应用正确的 UTF-8 编码。

    如果在封闭的生态系统中使用 JSON,您可以使用其他文本编码(尽管我建议您不要使用它,除非您有充分的理由)。如果您需要在非 UTF-8 编码中转义度数字符,正确的转义序列是 \u00b0

    可能但不推荐

    {
      "units": "\u00b0C"
    }
    

    您的第二种方法在任何情况下都不正确。

    不正确

    {
      "units":"c2b0"
    }
    

    使用“\xc2\xb0”之类的内容也是不正确的。这是 C/C++ 源代码中使用的转义。调试器也使用它来显示字符串。在 JSON 中,它总是无效的。

    也不正确

    {
        "units":"\xc2\xb0"
    }
    

    【讨论】:

    • 是否也可以使用类似´ {"units":"\xc2\xb0"} ´?
    • 我正在使用的 JSONCPP 库将包含°C 的字符串自动转换为 \u00b0 C
    • 真可惜。目的可能是创建 ASCII 文本,因此字符串编码的相关性较低。当涉及到字符串编码时,C 和 C++ 是迟钝的。而{"units":"\xc2\xb0"} 总是不正确的。那是 C/C++ 语法。您的调试器可能会像这样以 UTF-8 编码显示字符串。
    • RFC 8259(2017 年 12 月)放弃了 UTF-16 和 UTF-32 作为标准(用于系统间交换)。作家至少应该开始关注这一点。
    • 感谢您提供更多信息。这是明智之举。
    【解决方案2】:

    JSON 使用 unicode 进行编码,但指定您可以使用\uxxxx 转义码来表示不映射到您的计算机本机环境的字符,因此包含此类转义序列并仅使用普通字符是完全有效的ascii 编码传输 JSON 序列化数据。

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2016-05-06
      • 2013-03-30
      • 2014-02-05
      • 2010-12-10
      • 2017-05-14
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多