json库 Unicode解析

解析思路:

json字符串中/uXXXX是用十六进制表示码点U+0000 至 U+FFFF。
我们需要:

  1. 将4位十六进制整数解析成码点(Unicode字符)。
  2. 将码点编码成UTF-8,该过程可能要处理代理对。

实现过程及遇到的问题;

1. Unicode相关知识:

Unicode及编码规则介绍
Unicode是为了解决ASCII码表示字符数过少,各地区编码方式不同这两个问题而出现,Unicode为每个字符分配唯一的码点,就像身份证号码一样,码点的表示是U+XXXXXX,X表示十六进制数。
码点的取值范围是U+0000 - U+10FFFF,理论大小为10FFFF+1= 110000(十六进制,+1是因为从0开始)。110000第二个1表示164=65536,第二个1表示有16个164,总共有(16+1)个164码点。Unicode将这17个部分分成17个平面,第一个平面是BMP(基本多语言平面),其他的是增补平面。
Unicode的编码规则常见的有UTF-8、UTF-16 和 UTF-32,每种UTF会把码点存储为一至多个编码单元,其中UTF-8、UTF-16是可变长度编码。

UTF实现可变长度编码
在BMP平面挖出两份1024个编码位置,一个做高代理区(D800–DBFF),一个做低代理区(DC00–DFFF),这两个区组成的二维表格有10241024 = 16 * 65536个新的编码(8到B是4,FF-00+1=256, 4256=1024),刚好可以覆盖后面的16个平面。

UTF-8对码点的编码
UTF-8是可变长编码,采用保留高位的方法避免了解析歧义的问题,比如将1编码成a,将12编码成b,程序遇到1的时候就不知道该选择哪个进行编码了,如图,多字节是不会包含一字节的模式,缺点是编码空间变少了。
编码规则如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值