在 JSON 字符串中序列化 utf-8 字符的标准方法

D_w*_*der 0 c++ json utf-8 jsoncpp c++11

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

\n\n

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

\n\n

例如,我的温度读数单位为 \xc2\xb0C。是否应该序列化为

\n\n
{\n "units": "\\u00b0"\n}\n\xc2\xb4\xc2\xb4\xc2\xb4\nor should it be something like \n\xc2\xb4\xc2\xb4\xc2\xb4\n{\n "units":"c2b0"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者这两者都可以得到标准支持。

\n

Cod*_*odo 6

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

\n

正确并推荐

\n
{\n  "units": "\xc2\xb0C"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

可能但不推荐

\n
{\n  "units": "\\u00b0C"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

不正确

\n
{\n  "units":"c2b0"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

也不正确

\n
{\n    "units":"\\xc2\\xb0"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 真丢脸。其目的可能是创建 ASCII 文本,因此字符串编码的相关性较低。C 和 C++ 在字符串编码方面是落后的。并且 `{"units":"\xc2\xb0"}` 总是不正确的。这就是 C/C++ 语法。您的调试器可能会像这样显示 UTF-8 编码的字符串。 (2认同)