Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 存储为UTF-8的JSON需要两种编码转换_C++_Json - Fatal编程技术网

C++ 存储为UTF-8的JSON需要两种编码转换

C++ 存储为UTF-8的JSON需要两种编码转换,c++,json,C++,Json,JSON字符串可以包含转义序列:\u四个十六进制数字,即两个八位字节 在将四个十六进制数字读入代码> C1、C2、C3、C4之后,JSON精神C++库返回一个字符值为“代码>”的字符(HeXitoToNum(C1)。 1) JSON中的\u转义值是UTF-16代码单位,而不是UCS-2代码点,尽管wikipedia声称,这些代码点与UCS-2不(一定)相同,UTF-16不是100%字节兼容的(尽管它们适用于Unicode 2.0标准中创建UTF-16之前存在的所有字符) 2) JSON转义序列可

JSON字符串可以包含转义序列:\u四个十六进制数字,即两个八位字节


在将四个十六进制数字读入代码> C1、C2、C3、C4</C>之后,JSON精神C++库返回一个字符值为“代码>”的字符(HeXitoToNum(C1)

。 1) JSON中的\u转义值是UTF-16代码单位,而不是UCS-2代码点,尽管wikipedia声称,这些代码点与UCS-2不(一定)相同,UTF-16不是100%字节兼容的(尽管它们适用于Unicode 2.0标准中创建UTF-16之前存在的所有字符)

2) JSON转义序列可以通过使用代码单元的代理项对来表示所有UTF-16


您的结束断言仍然正确-您可以安全地解析JSON并将其存储在std::string中,但转换不能基于您所做的假设(并且使用std::string本质上存储一组字节可能无论如何都不是您想要的)。

您的问题是冗长的。如果JSON是UTF-8编码的字符串,那么当然可以遍历它,并用相应的UTF-8字节序列替换出现的每一个
\uxxx
。(不要忘记错误检查。)“而且使用std::string本质上存储一组字节可能不是您想要的”,为什么不呢?毕竟,这就是它的目的
std::vector
不允许使用诸如小字符串优化之类的有用功能,这些功能甚至对UTF-8或UTF-16字符串也很有用。显然,文本搜索等对于一般的Unicode使用是不好的,但是对于Unicode编码的字符串来说,
std::basic_string
仍然是一个很好的数据存储对象。所以,维基百科准确地指出了你所说的:它们不是100%字节兼容的,它只计算UTF-16出现之前存在的代码点。不,我并没有只是加上;)是OP误读了这篇维基文章。我完全错过了代理对的事情,这让我想到有两个八位组的限制,并想知道这可能意味着什么。我的JSON UTF-8解析器现在可以通过将UTF-16的四个八位字节转换为UTF-8来处理JSON字符串转义“\uD834\uDD1E”(G谱号字符U+1D11E)。