gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:02 24 4
gpt4 key购买 nike

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

将四个十六进制数字读入 c1, c2, c3, c4 后, JSON Spirit C++ 库返回值为 (hex_to_num (c1) << 12) + (hex_to_num (c2) << 8) + (hex_to_num (c3) << 4) + hex_to_num (c4) 的单个字符.

基于解码方案的简单性,并且基于只有 2 个八位字节要解码,我得出结论,JSON 转义序列仅支持 UCS-2 编码,即从 BMP U+0000 到 U+FFFF 编码的文本“按原样”使用代码点作为 16 位代码单元。

由于 UTF-16 和 UCS-2 将 U+0000 到 U+FFFF 中的有效代码点编码为单个 16 位代码单元,在数值上等于相应的代码点 (wikipedia),因此可以简单地假设解码后的 UCS-2 字符是 UTF-16 字符。

转义字符不同于普通的未转义 JSON 字符串,它可以包含“any Unicode character except " or \ or control-character(json spec) .由于 JSON 是 ECMAScript 的子集,因此假定为 UTF-16 (ecma standard) ,我得出结论,JSON 支持 UTF-16 编码,它比转义序列提供的更广泛

现在已经将所有 JSON 字符串减少为 UTF-16,如果将它们从 UTF-16 转换为 UTF-8,我的理解是可以将 UTF-8 存储在 Linux 上的 std::string 中,因为在处理过程中,人们通常可以忽略几个 std::string 字符被消耗来表示一个 6 字节长的 UTF-8 序列。

如果上述所有假设和解释都正确,则可以安全地解析 JSON 并将其存储到 Linux 上的 std::string 中。有人可以验证一下吗?

最佳答案

你在几个方面是错误的:

1) JSON 中的\u 转义值是 UTF-16 代码单元,而不是 UCS-2 代码点,尽管有维基百科的声明,但与 UCS-2 和 UTF-16 不一样(不一定) 100% 字节兼容(尽管它们适用于在 Unicode 2.0 标准中创建 UTF-16 之前存在的所有字符)

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

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

关于c++ - 存储为 UTF-8 的 JSON 需要两次编码转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8335021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com