javascript - JSON 解析器如何编码不在基本多语言平面中的 unicode 字符?

标签 javascript json unicode xojo

我正在 Xojo 中编写一个 JSON 解析器。除了我不知道如何编码和解码不在基本多语言平面 (BMP) 中的 unicode 字符串这一事实之外,它的工作原理。换句话说,如果遇到大于 \uFFFF 的内容,我的解析器就会死掉。 .

规范说:

To escape a code point that is not in the Basic Multilingual Plane, the character may be represented as a twelve-character sequence, encoding the UTF-16 surrogate pair corresponding to the code point. So for example, a string containing only the G clef character (U+1D11E) may be represented as "\uD834\uDD1E". However, whether a processor of JSON texts interprets such a surrogate pair as a single code point or as an explicit surrogate pair is a semantic decision that is determined by the specific processor.



我不明白的是从 U+1D11E 出发的算法是什么至\uD834\uDD1E .我找不到任何关于如何“编码对应于代码点的 UTF-16 代理对”的解释。

例如,假设我想对笑脸字符 (U+1F600) 进行编码。作为 UTF-16 代理对,这将是什么?派生它的工作是什么?

有人可以请至少指出我正确的方向吗?

最佳答案

摘自 Remy Lebeau 在上述评论中链接的维基百科文章 (link):

To encode U+10437 (𐐷) to UTF-16:

Subtract 0x10000 from the code point, leaving 0x0437. For the high surrogate, shift right by 10 (divide by 0x400), then add 0xD800, resulting in 0x0001 + 0xD800 = 0xD801. For the low surrogate, take the low 10 bits (remainder of dividing by 0x400), then add 0xDC00, resulting in 0x0037 + 0xDC00 = 0xDC37. To decode U+10437 (𐐷) from UTF-16:

Take the high surrogate (0xD801) and subtract 0xD800, then multiply by 0x400, resulting in 0x0001 × 0x400 = 0x0400. Take the low surrogate (0xDC37) and subtract 0xDC00, resulting in 0x37. Add these two results together (0x0437), and finally add 0x10000 to get the final decoded UTF-32 code point, 0x10437.

关于javascript - JSON 解析器如何编码不在基本多语言平面中的 unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52881143/

相关文章:

perl - 我怎么能捕捉到 "Unicode non-character"警告?

javascript - 可以在 Ext JS 中将 XML 响应作为流读取吗

javascript - 使用不变性助手修改数组的每个值

javascript - Hammer.js 滑动停止垂直滚动 ipad

php - 如何在 slim 框架中将 http 响应状态添加到 rest api

javascript - <div> 标签未显示 Ajax 的 JSON 响应

java - 如何使用 Java 将 JSONArray 转换为 R 数据框?

python - 在python中转义mysql的单引号和双引号

c++ - 如何在 C++ 中将 unicode 字符转换为大写

javascript - 如何为 express.static 模拟 http.ServerResponse 和 http.IncomingMessage