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_t
4字节长?
我觉得我的解决方案有问题,但我不明白是什么.在那种情况下我该怎么办?
ere*_*eOn 13
经过一番挖掘并感谢H2CO3的评论和Philipp的评论,我终于明白了这应该如何运作:
阅读RFC4627,部分3. Encoding
:
编码
JSON文本应以Unicode编码.默认编码为
UTF-8.由于JSON文本的前两个字符将始终为ASCII字符[RFC0020],因此可以确定八位字节
流是UTF-8,UTF-16(BE或LE)还是UTF-32(BE或LE)通过查看
前四个八位字节中的空值模式.Run Code Online (Sandbox Code Playgroud)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".
对不在基本多语言平面中的字符进行更完整的解释.
要转义不在基本多语言平面中的扩展字符,该字符表示为十二个字符的序列,
编码UTF-16代理项对.因此,例如,
仅包含G谱号字符(U + 1D11E)的字符串可以表示为
"\ uD834\uDD1E".
希望这可以帮助.