我正在用 C++ 编写 JSON 解析器,在解析 JSON 字符串时遇到问题:
JSON 规范规定 JSON 字符串可以包含以下形式的 unicode 字符:
"here comes a unicode character: \u05d9 !"
我的 JSON 解析器尝试将 JSON 字符串映射到std::string
所以通常情况下,JSON 字符串中的一个字符会成为std::string
。但是对于那些 unicode 字符,我真的不知道该怎么办:
我应该将原始字节值放入我的std::string
像这样:
std::string mystr;
mystr.push_back('\0x05');
mystr.push_back('\0xd9');
或者我应该用像这样的库来解释这两个字符iconv
并将 UTF-8 编码结果存储在我的字符串中?
我应该使用std::wstring
存储所有字符?那么在 *NIX 操作系统上呢?wchar_t
是 4 字节长吗?
我感觉到我的解决方案有问题,但我不明白是什么。在这种情况下我该怎么办?
经过一番挖掘并感谢H2CO3 的评论 https://stackoverflow.com/questions/13107329/how-to-handle-unicode-values-in-json-strings#comment17817077_13107329 and 菲利普的评论 https://stackoverflow.com/questions/13107329/how-to-handle-unicode-values-in-json-strings/13107892#comment17817850_13107329,我终于明白这是如何工作的:
正在阅读RFC4627 http://www.ietf.org/rfc/rfc4627.txt?number=4627, 部分3. Encoding
:
-
Encoding
JSON 文本应以 Unicode 编码。默认编码是
UTF-8。
由于 JSON 文本的前两个字符始终是 ASCII
字符[RFC0020],可以确定是否是一个八位字节
通过查看流是否为 UTF-8、UTF-16(BE 或 LE)或 UTF-32(BE 或 LE)
前四个八位位组中的空值模式。
00 00 00 xx UTF-32BE
00 xx 00 xx UTF-16BE
xx 00 00 00 UTF-32LE
xx 00 xx 00 UTF-16LE
xx xx xx xx UTF-8
因此,JSON 八位字节流似乎可以用 UTF-8、UTF-16 或 UTF-32 进行编码(后两种是其 BE 或 LE 变体)。
一旦明确了这一点,Section 2.5. Strings
解释如何处理这些\uXXXX
JSON 字符串中的值:
任何字符都可以被转义。如果角色在基本模式中
多语言平面(U+0000 到 U+FFFF),那么它可能是
表示为一个六字符序列:反向斜线,后面跟着
由小写字母 u 后跟四个十六进制数字
对字符的代码点进行编码。十六进制字母 A 虽然
F 可以是大写或小写。因此,例如,一个字符串包含
只有一个反斜线字符可以表示为
“\u005C”。
对不在其中的角色有更完整的解释基础多语种飞机 http://en.wikipedia.org/wiki/Plane_(Unicode).
转义基本多语言中不存在的扩展字符
平面上,字符被表示为十二个字符的序列,
对 UTF-16 代理项对进行编码。因此,例如,一个字符串
仅包含 G 谱号字符 (U+1D11E) 可以表示为
“\uD834\uDD1E”。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)