- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在读取包含“\ud83e\udd14”的 UTF-8 文本。阅读规范,它说未使用 U+D800 至 U+DFFF。然而,如果我通过 Microsoft 的 System.Web.Helpers.Json.Decode 之类的解码器运行它,它会产生伸出舌头的面部表情符号的正确结果。该文本源自 Twitter 的搜索 API。
我的问题:这个序列应该如何解码?我正在寻找最终的十六进制序列是什么以及它是如何获得的。感谢您的任何指导。如果我的问题不清楚,请告诉我,我会尽力改进。
最佳答案
您是从一个有趣的角度来看这个问题的。首先要注意的是,您正在处理两个级别的文本:JSON 文档和其中的字符串。
概要:您不需要编写代码来解码它。使用将 JSON 反序列化为对象的库,例如 Newtonsoft 的 JSON.Net .
但是,首先是 Unicode。 Unicode 是一个有一定历史的字符集。与几乎所有字符集不同,1)它有多种编码,2)它仍在增长。几十年前,它的代码点<65636,这被认为是足够的。因此,计划将每个代码点编码为 2 字节整数。它被称为 UCS-2,或者简称为 Unicode 编码。 (微软在 .NET 中坚持使用 Encoding.Unicode,这会导致一些困惑。)
旁白:使用 U+ABCD(十六进制)格式标识用于讨论的代码点。
然后 Unicode 联盟决定添加更多代码点:一直到 U+10FFFF。为此,编码至少需要 21 位。 UTF-32(32 位整数)是一个显而易见的解决方案,但不是很密集。因此,发明了使用可变数量的代码单元的编码。 UTF-8 使用一到四个 8 位代码单元,具体取决于代码点。
但是很多语言在 20 世纪 90 年代都采用了 UCS-2。当然,文档可以随意转换,但如果没有扩展字符集的兼容编码,处理 UCS-2 的代码就会中断。由于 U+D800 到 U+DFFF 未分配,UCS-2 可以保持不变,并且这些“代理代码点”可用于编码新的代码点。结果是 UTF-16。每个代码点都以一个或两个 16 位代码单元进行编码。因此,处理 UCS-2 的程序可以自动处理 UTF-16,只要它们不需要理解它。在同一系统中编写的程序可以被视为正在处理 UTF-16,尤其是对于能够理解它的库。仍然存在诸如字符串长度给出 UTF-16 代码单元数量而不是代码点数量之类的危险,但它在其他方面表现良好。
对于\ud83e\udd14 表示法,语言在其语法或文字字符串中使用 Unicode,需要一种方法来接受非 Unicode 编码的源文件,并且仍然支持所有 Unicode 代码点。它们是在 20 世纪 90 年代设计的,只是以十六进制编写 UCS-2 代码单元。当然,这也扩展到了 UTF-16。这种 UTF-16 代码单元转义语法允许中间系统处理具有非 Unicode 编码的源代码文件。
现在,JSON 基于 JavaScript,而 JavaScript 的字符串是 UTF-16 代码单元的序列。所以 JSON 采用了来自 JavaScript 的 UTF-16 代码单元转义语法。但是,它不是很有用(除非您必须处理无法使用 UTF-8 的中间系统或将它们不能理解的文件视为二进制文件)。旧的 JSON 标准要求系统之间交换的 JSON 文档使用 UTF-8、UTF-16 或 UTF-32 进行编码。新RFC8259需要 UTF-8。
所以,你没有“UTF-8 文本”,你有 UTF-8 的 Unicode 文本编码。文本本身是一个 JSON 文档。 JSON 文档的名称和值是 Unicode 文本,作为允许转义的 UTF-16 代码单元序列。您的文档的代码点为 U+1F914,不是“🤔”,而是“\ud83e\udd14”。
有很多库可以将 JSON 转换为对象,因此您不需要解码 JSON 文档中的名称或值。要手动执行此操作,您需要识别转义前缀并将接下来的 4 个字符作为代理项 extracting the data bits, then combine 的位。它们与来自配对代理的位应该跟随。
关于utf-8 - 如何解码 UTF-8 文本序列\ud83e\udd14,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49227417/
我试图通过另一个 Unix Domain Socket 连接将已建立的连接 Unix Domain Socket 文件描述符从进程 A 传递到进程 B,但没有成功虽然 TCP 套接字传递没有问题。这是
这个问题在这里已经有了答案: Parameter evaluation order before a function calling in C (7 个答案) 关闭 7 年前。 在我的代码中有这一
我正在为一项作业编写一个小型 UDS 服务器,并且感觉我的代码大部分都在那里,但当我实际尝试运行它时,我完全没有得到任何结果。 代码通过 shell 脚本进行测试,该脚本向我的代码的主函数发送多个不同
这段用c++写的代码是什么意思? PGBulkInserter pgBulkInserter(postgreSQL, HOST_TRAFFIC_SCHEMA_NAME, date,
SID2E和SID22中是否存在整帧长度超过7字节的情况? 如果是,那么它将如何发送或写入数据字节? 最佳答案 是的,UDS 中的常见用例是对 SID 0x22 (ReadDataByIdentifi
SID2E和SID22中是否存在整帧长度超过7字节的情况? 如果是,那么它将如何发送或写入数据字节? 最佳答案 是的,UDS 中的常见用例是对 SID 0x22 (ReadDataByIdentifi
刚刚启动kivy框架,在kivy painting app tutorial有这样一行代码: touch.ud['line'] = Line(points=(touch.x, touch.y)) 有人
按照 here 中的说明为西类牙语-Ancora UD 语料库训练我自己的 SyntaxNet 模型没有给我错误。 在所有步骤之后,它创建的最终文件是: -category-map -char-ma
我有一张 table 。我有一个用户定义的函数(UDF)。我的 UDF 返回一张表。我需要左外连接我的表和 UDF 表。 最佳答案 使用 SQL Server 2005 的新 APPLY 子句。 AP
当客户端连接到管道并发送数据时,我可以很好地接收到数据,并且可以继续接收数据。当客户端断开连接并且 while 循环仍然处于事件状态时,问题就来了,connection.recv() 不会阻塞,因此会
我正在开发运行 Linux 的嵌入式设备。在我的应用程序中,服务器线程打开 UDS 套接字并等待连接。当客户端(不同的应用程序/进程)连接时,它会处理请求并发送请求的数据。 请求的数据通常大于52KB
我在 Android 10 设备上运行 2 个应用程序,它们通过 uds 相互通信。一切正常,直到我将应用程序设置更改为针对 android 10。我在 logcat 中收到以下错误: 09-07 1
试过这个: $('.link').click(function(e) { $.getScript('http://www.google.com/uds/api?file=uds.js&v=1
我正在编写一个基于fork()的服务器,TCP套接字是客户端与服务器的通信 channel ,而UDS套接字(数据报,如果有什么区别的话)是通信管理控制台与服务器的 channel 。 监听两种套接字
我试图在 C++ 程序中尽快将数据从一个 UDS 传递到另一个,但 UDS 不支持 splice (如 fd_in)。 UDS 是否支持尽可能接近零拷贝的替代方案? This question被要求提
我正在尝试通过 XL 驱动程序库构建 UDS 协议(protocol)来构建诊断应用程序,但不知道应该从哪里开始。 最佳答案 Python 中存在整个库堆栈。看UdsOnCAN将处理应用程序层的包。您
每次我从后堆栈中删除YouTubePlayerSupportFragment时,都会在logcat中收到以下错误: 06-12 02:08:46.937 8805-8805/ D/GA_DEBUG:
我是一名优秀的程序员,十分优秀!