带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(4)

简介: 带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(4)

带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(3) https://developer.aliyun.com/article/1240886?groupCode=tech_library


10.4、UTF-16(Java内部编码)


UTF是Unicode Transfer Format的缩写,即把Unicode转做某种格式的意思,所以UTF-16是Unicode编码里的其中一种实现方式,16代表的是字节位数,占两个字节(UTF-32则表示4个字节)。


Unicode 设计之初是采用UTF-16这种双字节定长编码的,其字符编号就是对应的二进制编号,也就是说第二层的CCS和第三层的CEF是一致的。比如汉字“万”的 Unicode 码点是 “U+4E07”,其二进制序列就是直译的“0100 1110 0000 0111 ”,这种编码方式的优点是高效,不需要检查标志位,但缺点是不兼容ASCII,ASCII编码的文本都会显示乱码。


不过:后来Unicode联盟发现 16 位编码空间根本不够用,与此同时 ISO/IEC组织也觉得 UCS的 32 位编码空间太多了,实际中根本没有几十亿字符,也挺浪费空间的。


所以最终 Unicode 联盟和 ISO/IEC 工作组达成一致:两者使用统一的编码空间“ 0000 ~ 10FFFF”(即 UCS 保证永远不分配大于 10FFFF 的字符码点),而且双方在字符编码上保持同步,即一方标准中增加了字符,也要通知另一方同步。


于是:Unicode在UTF-16基础上拓展编码空间到 21 位,UCS则搞了一个双字节的UCS-2编码实现。


UTF-16 编码是双字节的,上限也只有6w多个码点,怎么让他支持到10FFFF(100w+)个码点呢?


本质就是:多加几个字节来表示更多的字符,只是UTF-16不像UCS那样采用定长4字节,而是使用变长的形式,但是这个跟UTF-8变长方式又不太一样,他是采用代理对的方式实现,大部分常用字符用一个码元表示(定长2个字节),其他扩展的特殊字符用两个码元表示(定长4字节)。



带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(5) https://developer.aliyun.com/article/1240883?groupCode=tech_library

相关文章
|
7月前
|
存储 JavaScript Java
[字符编码] 理论篇:常见字符集与编码方式
[字符编码] 理论篇:常见字符集与编码方式
192 0
|
存储
带你读《全景揭秘字符编码》之二:二、什么是字符编码?
带你读《全景揭秘字符编码》之二:二、什么是字符编码?
255 1
|
编解码 算法 Unix
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(9)
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(9)
138 0
|
存储
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(8)
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(8)
181 0
|
自然语言处理
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(2)
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(2)
152 0
|
自然语言处理
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(6)
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(6)
165 0
|
存储
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(5)
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(5)
157 0
|
存储 编解码
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(1)
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(1)
194 0
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(10)
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(10)
101 0
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(3)
带你读《全景揭秘字符编码》之十:常见字符编码4:UNICODE(3)
201 0