本文比较完整地整理一下 JSON 编码中的转义,以及 JSON 对 Unicode 编码的处理。

其实这是我上一篇文章的姊妹篇。在研究 Unicode 颜文字的时候,由于我们的数据传输是通过 JSON 串来完成的,在对颜文字进行转码传输的过程中,也发现了一个问题。解决问题之后,便有了本总结文。

JSON 中的普通转义字符

marshal
"\"/\/\\\\b\b\f\f\t\r\r\n\n<\u003C>\u003E&\u0026
%\u0025

JSON 中针对 Unicode 字符的处理

这里所说的 Unicode 字符,准确而言指的是在 ASCII 范围之外的字符,也就是值大于 0x7F 的 Unicode 字符。

其实大部分情况下,UTF-8 已经成为现代编程语言约定俗成的标准了,因此在 JSON 序列化时,只要简单地对 Unicode 字符的值转为二进制然后按照网络字节序打包就可以了。

但是在某些情况下,当对端采用的不是 UTF-8,或者是对端采用的不是网络字节序时(比如对方是技术底下/落后、但却话语权强大的客户/合作商/集成商),这个时候,大家统一采用 ASCII 编码,就能够避免这些问题了。

\uXXXXXXXX

大于 0xFFFF 的 Unicode 字符的编码

\uXXXX
u
u = u - 0x10000hihi = (u & 0xFFC00) >> 10lolo = u & 0x003FF0xD800\u0xDC00\u
0x1F30D
u = 0x1F30D - 0x10000 = 0xF30D1111 0011 0000 1101000011110011000011010x03C0xD83C0x30D0xDF0D\uD83C\uDF0D

比如以下的 JSON:

{
    "string":"我是地球????"
}

按照 ASCII 序列化之后,结果为:

{"string":"\u6211\u662F\u5730\u7403\uD83C\uDF0D"}

参考资料


原文标题:JSON 序列化中的转义和 Unicode 编码

发布日期:2020-05-31

Copyright