图说我对Unicode的几点理解
来源:互联网 发布:原型软件墨刀 编辑:程序博客网 时间:2024/04/30 03:19
代码点
Unicode标准的本意很简单:希望给世界上每一种文字系统的每一个字符,都分配一个唯一的整数,这些整数叫做代码点(Code Points)。
代码空间
所有的代码点构成一个代码空间(Code Space),根据Unicode定义,总共有1,114,112个代码点,编号从0x0到0x10FFFF。换句话说,如果每个代码点都能够代表一个有效字符的话,Unicode标准最多能够编码1,114,112,也就是大概110多万个字符。最新的Unicode标准(7.0)已经给超过11万个字符分配了代码点。
代码平面
Unicode标准把代码点分成了17个代码平面(Code Plane),编号为#0到#16。每个代码平面包含65,536(2^16)个代码点(17*65,536=1,114,112)。其中,Plane#0叫做基本多语言平面(Basic Multilingual Plane,BMP),其余平面叫做补充平面(Supplementary Planes)。Unicode7.0只使用了17个平面中的6个,并且给这6个平面起了名字,如下图所示:
下面是这些平面的名字和用途:
- Plane#0 BMP(Basic Multilingual Plane)大部分常用的字符都坐落在这个平面内,比如ASCII字符,汉字等。
- Plane#1 SMP(Supplementary Multilingual Plane)这个平面定义了一些古老的文字,不常用。
- Plane#2 SIP(Supplementary Ideographic Plane)这个平面主要是一些BMP中没有包含汉字。
- Plane#14 SSP(Supplementary Special-purpose Plane)这个平面定义了一些非图形字符。
- Plane#15 SPUA-A(Supplementary Private Use Area A)
- Plane#16 SPUA-B(Supplementary Private Use Area B)
BMP
BMP是最重要的一个代码平面,大部分常用的字符都定义在这个平面内,如下图所示:
在BMP中定义的代码点包括:
- ASCII ASCII总共有128个字符,占据了BMP的前128个代码点(上图绿线)
- ISO-8859-1 共256个字符,占据了BMP的前256个代码点(上图绿线+蓝线)
- CJK Unified Ideographs 上图的红色区域(占据BMP大约1/3)定义了两万多个汉字,其中前20,902个汉字是按照《康熙字典》里笔画顺序排列的
- Surrogate Code Points 从0xD800到0xDBFF的1024个代码点是High-surrogate代码点,从0xDC00到0xDFFF的1024个代码点是Low-surrogate代码点。这2048个代码点并不是有效的字符代码点,它们是为UTF编码保留的。一个High-surrogate代码点和一个Low-surrogate代码点组成一个代理对(Surrogate Pair),可以在UTF-16里编码BMP之外的某个代码点(1024^2+65,536=1,114,112)。
UTF-16
UTF-16是Unicode的一种编码方式,它用两个字节来编码BMP里的代码点,用四个字节编码其余平面里的代码点(暂不考虑字节顺序)。由于BMP里只有65535个代码点,所以直接把代码点转换成2个字节就可以了。BMP之外的平面稍微复杂一点,需要先将代码点转化为一个代理对,然后再转为4个字节,见下图:
假设要编码的补充平面内的代码点为X,具体的编码过程为:
- X必定在0x010000到0x10FFFF之间
- 将X减去0x010000,得到的数在0x0到0xFFFFF之间,正好可以用20个bit来表示
- 将高位的10个bit和0xD800相加,将地位的10个比特和0xDC00相加,得到的正好是一个代理对,也就是四个字节
参考资料
本文主要参考资料:
- Wikipedia
- Unicode
- Plane
- ASCII
- ISO-8859-1
- CJK Unified Ideographs
- UTF-16
- Unicode character table
- 图说我对Unicode的几点理解
- 对String的几点理解
- 对position的几点理解
- 我对同学的几点建议
- 我对Swift的几点疑问
- 主题:ruby对unicode处理的几点经验
- 个人对银行知识的几点认识和理解
- 对Gabor在图像中应用的几点理解~!
- 对*nix中inode的几点理解
- 个人对银行知识的几点认识和理解
- Swift 【对构造器自动继承的几点理解】
- 我对CSDN blog的几点不满
- 我对垂直搜索引擎的几点认识
- 我对汉编著的几点看法
- 我对读计算机软件专业硕士的几点看法
- 我对现代人爱情的几点看法!
- 我对读计算机软件专业硕士的几点看法!
- 我对读计算机软件专业硕士的几点看法
- Xcode 5 单元测试(二)OCMock和GHUnit
- AAC打包ADTS格式
- 解决在非Activity中使用startActivity
- Sinesafe 服务器流量监控软件 专注于Windows 服务器
- BCB Socket通信 TClientSocket
- 图说我对Unicode的几点理解
- 《TCP-IP详解卷1:协议》读书笔记三 IP网际协议
- java读取大文件
- opencv2.4.9 linux源码安装过程及问题
- 通过生产者消费者问题比较信号量和信号【Java实现】
- kb967723补丁卸载软件完美卸载
- linux中shell变量$#,$@,$0,$1,$2的含义解释
- OpenStack 部署总结之:在CentOS 6.5上使用RDO安装双结算结点的icehouse(Ml2+GRE)
- Lua使用Vector容器