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

2024-03-27

我正在用 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:

  1. 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解释如何处理这些\uXXXXJSON 字符串中的值:

任何字符都可以被转义。如果角色在基本模式中
多语言平面(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(使用前将#替换为@)

如何处理 JSON 字符串中的 unicode 值? 的相关文章

  • 以编程方式最大化屏幕一半的窗口

    我想最大化屏幕左侧的随机窗口 我可以在我的代码中使用 Windows Aero 函数吗 这个窗口can像用鼠标一样最大化 我只想以编程方式做到这一点 I use C 我可以得到IntPtr窗户的 如果可能的话 不要伪造鼠标或键盘输入 这可以
  • 如何在命名管道 (mkfifo) 上执行非阻塞 fopen?

    如果我有一个程序使用 mkfifo 创建并尝试打开命名管道 如何在不阻塞的情况下打开管道进行读取或写入 具体来说 我正在编写一个 C 程序 它可以在有或没有 GUI 的情况下运行 用 Java 编写 在 C 程序中 我使用 mkfifo 成
  • QT 5.6 QWebEngine不保存cookie

    我正在创建名为 webengine 的简单 QT 应用程序 pWebView new QWebEngineView this pWebView gt load QUrl http technoz ru pWebView gt show On
  • 编写无 BOM 的 UTF-8

    这段代码 OutputStream out new FileOutputStream new File C file test txt out write A getBytes 和这个 OutputStream out new FileOu
  • 在iOS中,在纯C中,这是获取本地文件路径的方法吗?

    我需要最终得到一个 cstring 作为捆绑包中文件的本地路径 First include
  • 从该共享库中查找加载的共享库的位置?

    从共享库中的函数 在正在运行的进程 用 C 编写 内 我如何发现该共享库是从哪里加载的 我找到的所有答案都涉及使用诸如ldd在命令行中 或者通过查看 proc self maps 在 Win32 上 我只需使用GetModuleFileNa
  • C++ Boost.asio Ping

    我正在尝试编写一个程序来列出网络上设备的所有 IP 地址 其主要组成部分之一是能够对设备执行 ping 操作 这个程序必须在Linux Windows和Mac上运行 所以我选择了Boost库 我设法在文档中找到这个示例 http www b
  • 如何在 Visual C++ 中创建 ActiveX DLL

    是否有在 Visual Studio 2008 C 中创建 ActiveX DLL 的教程 参考 我有一个使用 DLLRegisterServer UnregisterServer 构建的 DLL 并且已注册 但我在弄清楚使用什么名称来引用
  • std::function 和 std::bind 行为

    我有这个代码 include
  • 无法打开作为链接添加的 configSource 文件

    在我的 MVC 应用程序中 我使用外部配置文件来保持干净的 web config 有些文件很常见 我将它们作为链接从一个位置添加到项目中 对于这些文件 我将 复制 选项设置为 始终复制 这些文件将被复制到目标文件夹 我会看到它们 但是当我尝
  • C++ 条件变量通知未按预期工作

    我正在尝试在之前的工作完成后立即启动新线程worker thread has started 但也许结束了 也可能没有结束 我已经用时间延迟替换了开始和结束的工作 我的代码是 include
  • 将文本文件与 C# 中的文本模式进行比较?

    我将文本文件与类似的模式进行了比较 它正在将整行写入日志 如下所示 insert into depdb fin quick code met 但我需要单独写这个depdb或者depdb fin quick code met 即 我只需要这个
  • 如何从函数调用事件处理程序?

    我有一个类 我从中调用一个函数ABC string st 带字符串参数 该函数定义在一个Form class Form1 我有一个列表视图 想要从函数中自动调用列表视图 mouse click 事件 我该如何做到这一点 您不能调用另一个类的
  • 静态、非成员或静态非成员函数?

    每当我有一些 实用 方向的功能时 我最终都会想知道哪个选项是最好的 例如 在我正在工作的上下文中打印消息结构 自己的或外部的 一些编码 解码代码或一些有用的转换函数 我想到的选项是 1 辅助类 结构中的静态函数 struct helper
  • 在一个整数中找到另一个整数的 MSB 位置左侧的 N 个连续零位

    问题是 给定一个整数val1然后 给定第二个整数 找到最高位组 最高有效位 的位置val2找到第一个整数生成的位置左侧的未设置位的连续区域 width指定minimum必须在连续中找到的未设置位的数量 即width里面没有 0 这是我的解决
  • 为什么IL代码中stloc.0后面有一个ldloc.0?

    我正在尝试通过编写小代码片段和检查编译的程序集来学习 CIL 所以我写了这个简单的 if 语句 public static void Main string args Int32 i Int32 Parse Console ReadLine
  • WCF maxBytesPerRead 限制为 4096

    我在流模式下使用基本的 WCF Web 服务从服务器下载文件 我已将服务器端的绑定指定为
  • VB.NET 相当于 C# var 关键字 [重复]

    这个问题在这里已经有答案了 是否有与 C 等效的 VB NETvar关键词 我想用它来检索 LINQ 查询的结果 选项推断 http msdn microsoft com en us library bb384665 aspx必须是on为了
  • EF,Code First - 如何在插入时设置自定义 Guid 标识值

    在处理在数据库中插入新实体时 我面临以下问题Guid作为主键 代码优先的 EF 5方法 我知道有很多类似的主题 因为我为此问题运行了几个小时 但我找不到与此问题相关的主题 举个例子 我的 POCO 类是 public class Entit
  • 来自 StreamReader 的原始文件字节,幻数检测

    我试图区分 文本文件 和 二进制 文件 因为我实际上想忽略具有 不可读 内容的文件 我有一个文件 我认为它是 GZIP 存档 我试图通过检测幻数 文件签名来忽略此类文件 如果我在 Notepad 中使用十六进制编辑器插件打开文件 我可以看到

随机推荐

  • SQL 中的连接顺序重要吗?

    不考虑性能 下面的查询 A 和 B 会得到相同的结果吗 C和D怎么样 Scenario 1 A left join select from a left join b on
  • 在skiasharp中加载字体

    如何在 Xamarin 表单的 skiasharp 中使用自定义字体 I tried paint Typeface SKTypeface FromFamilyName CoText Bd and paint Typeface SKTypef
  • 将嵌套列表转换为嵌套字典

    我有这个清单 list1 X1 2 X2 4 Y1 2 Y2 4 我想创建这个字典 dict1 X 1 2 2 4 Y 1 2 2 4 这样我就可以使用dict1 X 1 这输出 2 有人可以帮我吗 我尝试了多种方法但没有成功 您可以使用c
  • C#读取Arduino

    我正在尝试制作一个从 Arduino 读取传出信号的应用程序 但我无法使其在 C 中工作Windows 窗体 http en wikipedia org wiki Windows Forms 仅在控制台中 我的 C Windows 窗体代码
  • 将 url 重写为 url:端口号

    如何重写下一个 url 请求 http mydomain com virtualDirectory default aspx param1 2 param2 car to http mydomain com 8888 virtualDire
  • GraphQL 缺少名称

    刚刚使用 Node 和 C 学习 GraphQL 我正在尝试将 C 示例移植到 Node 因为这将是一个很好的学习练习 因为我不太了解 Node 或 graphql 我有两种类型 帐户和所有者 即帐户所有者 以下内容一切正常 即拥有帐户的字
  • 深层链接导致应用程序的多个实例打开

    这个问题已经在类似的帖子中解决过 但是 我的情况有点不同 我只有一项活动和多个片段 我没有深入链接到特定的片段 我正在启动我的一项活动 然后重定向到不同的片段 我遇到的问题是 当单击深层链接时 应用程序的多个实例正在打开 并且当阻止应用程序
  • 相交矩形的总面积

    用于确定两个相交且可以旋转离开坐标轴的矩形的总面积的算法是什么 以下是您需要做的大致内容 尽可能笼统地表达 但涵盖了所有可能性 计算出交集的类别 IE 相交区域有多少条边 它可以是 0 到 8 之间的任何值 找到交点的所有顶点 这将是矩形边
  • 在播放来自 UIImagePickerController 的视频之前,AVPlayer 不会播放视频

    我遇到了一个问题 我在这里没有看到类似的帖子 我有一个AVPlayerViewController它播放基于我的路径的视频Firebase 数据库 不是存储 该视频按照我想要的方式完美播放 但只有当我观看了在UIImagePickerCon
  • 有没有一种方便的方法将 std::pair 包装为新类型?

    我经常发现自己使用 std pair 将两个相关量的逻辑分组定义为函数参数 返回值 一些示例 行 列 标签 值等 很多时候我真的应该滚动我自己的类 而不是仅仅使用 std pair 当事情开始崩溃时 很容易看出 当代码中充斥着 make p
  • React-native-multiple-select:无法读取未定义的属性“getSelectedItemsExt”

    我正在构建一个应用程序并引用这个link https github com toystars react native multiple select我为我的应用程序实现了相同的代码 但出现错误 无法读取未定义的属性 getSelected
  • 更改 Windows 窗体中的组合框边框颜色

    在我的应用程序中 我添加了组合框 如下图所示 我已将组合框属性设置为 cmbDatefilter FlatStyle System Windows Forms FlatStyle Flat 现在我的问题是如何设置组合框的边框样式 使其看起来
  • 传输到 ClientDataset 时的字符串截断

    我正在使用 Firebird 2 1 DevArt 的 DBExpress 驱动程序和 Delphi 2010 我的一些用于 Delphi 2006 的报告停止工作并生成一条错误消息 指示发生了 算术异常 数字溢出或字符串截断 我的代码此时
  • 如何从 Windows 客户端应用程序使用 openAuth?

    我正在考虑将公共 api 集成到现有的 Windows 窗体应用程序中 该 API 需要 openAuth 身份验证 我见过的所有例子都是基于网络的应用程序 如何在客户端应用程序上使用 openAUth thanks 这不是最容易解释的事情
  • 创建跨容器选项卡索引

    我面临着一个似乎无法解决的小问题 问题是在 WinForm 中我有几个容器 TabControls Panels 控件中的 Tab 键顺序工作正常 当然 但现在客户要求更改 taborder 从第一个容器 当前 tabindex 0 0 1
  • 如何创建所有子类的实例

    我有超过 250 个子类需要由它们组成的实例 我不能坐在那里羞涩地粘贴new Class 250次 是否有使用反射来创建类的实例 创建实例时不需要构造函数 谢谢 我真的不明白你的意思 但我尝试猜测 未测试 public class Test
  • 参数“samples”的预期哈希值(获取数组)

    我一直在关注 Railscasts 的嵌套形式和复杂形式的剧集 在以单个表单创建多个模型的过程中 我能够编辑 更新 删除和创建嵌套在批处理模型中的示例模型的记录 我很长时间以来一直在绞尽脑汁 也尝试四处寻找 但找不到任何正确的解决方案来解决
  • 如何离线存储密码

    虽然这是针对Windows Phone 7的 但我想这个原理是通用的 我想在我的应用程序中设置一个密码保护区 但是 我的应用程序完全离线 因此我必须在手机上存储凭据详细信息 我最初的想法是存储密码和盐的哈希值 这是最好的方法吗 如果是这样
  • 更改特定索引而不在 Vuejs 中重新渲染整个数组

    In a Vuejs项目 我有一个array in my 数据对象并将其呈现在视图中v for指示 现在 如果我更改该数组中的特定索引 Vue 会在视图中重新渲染整个数组 有没有办法在不重新渲染整个数组的情况下查看视图的变化 这个问题背后的
  • 如何处理 JSON 字符串中的 unicode 值?

    我正在用 C 编写 JSON 解析器 在解析 JSON 字符串时遇到问题 JSON 规范规定 JSON 字符串可以包含以下形式的 unicode 字符 here comes a unicode character u05d9 我的 JSON