Unicode 编码
Unicode 编码
官方文档:
TODO,整理一下官网,TODO
参考博客:
Unicode 与 JavaScript 详解 - 阮一峰的网络日志
字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的网络日志
基本原理
Unicode 源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了。
Unicode 的最新版本是 15.0 版,一共收入了 109449 个符号,其中的中日韩文字为 74500 个。可以近似认为,全世界现有的符号当中,三分之二以上来自东亚文字。比如,中文"好"的码点是十六进制的597D
。
|
|
这么多符号,Unicode 不是一次性定义的,而是分区定义。每个区可以存放 65536 个($2^{16}$次方)字符,称为一个平面(plane)。目前,一共有 17 个($2^5$次方)平面,也就是说,整个 Unicode 字符集的大小现在是$2^{21}$。
最前面的 65536 个字符位,称为基本平面(Basic Multilingual Plane,缩写 BMP),它的码点范围是从 0 一直到$2^{16}-1$,写成 16 进制就是从U+0000
到U+FFFF
。所有最常见的字符都放在这个平面,这是 Unicode 最先定义和公布的一个平面。剩下的字符都放在辅助平面(Supplementary Multilingual Plane,缩写 SMP),码点范围从 U+010000 一直到 U+10FFFF。
其实还有一个 SIP(Supplementary Ideographic Plane),只用于表示有很少使用的日文、中文和韩文。这一层被称为补充表意平面 (平面 2,SIP) 或互补表意区域。
需要注意的是,Unicode 只是一个符号集,一个逻辑符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。这就需要二次编码
比如,汉字严的 Unicode 是十六进制数 4E25,转换成二进制数足足有 15 位(100111000100101),也就是说,这个符号的表示至少需要 2 个字节。表示其他更大的符号,可能需要 3 个字节或者 4 个字节,甚至更多。
这里就有两个严重的问题,第一个问题是,如何才能区别 Unicode 和 ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
Unicode transformation format :UTF
UTF-32
UTF-8
UTF-16
Emoji
稍微了解一下,TODO
可以尝试在日志中输出表情包
零宽度字符
浅析什么是零宽度字符以及零宽度字符在实际中的应用场景 - 古兰精 - 博客园
这篇博客讲的很好
Java 核心技术卷一_第 3 章_Java 基本程序设计结构