如何处理JSON字符串中的unicode值?

ere*_*eOn 7 c++ unicode parsing json

我正在用C++编写JSON解析器,在解析JSON字符串时遇到问题:

JSON规范声明JSON字符串可以包含以下形式的unicode字符:

"here comes a unicode character: \u05d9 !"
Run Code Online (Sandbox Code Playgroud)

我的JSON解析器尝试将JSON字符串映射到std::string通常,JSON字符串的一个字符变成了一个字符std::string.但是对于那些unicode角色,我真的不知道该怎么做:

我应该把原始字节值放在我的std::string喜欢中:

std::string mystr;
mystr.push_back('\0x05');
mystr.push_back('\0xd9');
Run Code Online (Sandbox Code Playgroud)

或者我应该用类似的库解释这两个字符iconv并将UTF-8编码的结果存储在我的字符串中?

我应该使用a std::wstring存储所有字符吗?什么在*NIX操作系统上wchar_t4字节长?

我觉得我的解决方案有问题,但我不明白是什么.在那种情况下我该怎么办?

ere*_*eOn 13

经过一番挖掘并感谢H2CO3的评论Philipp的评论,我终于明白了这应该如何运作:

阅读RFC4627,部分3. Encoding:

  1. 编码

    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
    
    Run Code Online (Sandbox Code Playgroud)

因此,看起来JSON八位字节流可以用UTF-8,UTF-16或UTF-32编码(在BE或LE变体中,最后两个).

一旦清楚,Section 2.5. Strings解释如何\uXXXX在JSON字符串中处理这些值:

任何角色都可能被转义.如果字符在基本
多语言平面(U + 0000到U + FFFF)中,那么它可以
表示为六个字符的序列:反向固相,后跟
小写字母u,后跟四个十六进制数字,
编码角色的代码点.十六进制字母A到
F可以是大写或小写.因此,例如,
仅包含单个反向固相字符的字符串可以表示为
"\ u005C".

对不在基本多语言平面中的字符进行更完整的解释.

要转义不在基本多语言平面中的扩展字符,该字符表示为十二个字符的序列,
编码UTF-16代理项对.因此,例如,
仅包含G谱号字符(U + 1D11E)的字符串可以表示为
"\ uD834\uDD1E".

希望这可以帮助.