Chinaunix首页 | 论坛 | 博客
  • 博客访问: 429485
  • 博文数量: 83
  • 博客积分: 2622
  • 博客等级: 少校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 08:59
个人简介

一直在努力

文章分类

全部博文(83)

文章存档

2014年(3)

2013年(9)

2012年(46)

2010年(25)

分类: WINDOWS

2010-08-25 14:13:43

 

unicode 定义范围:

1. BMP(Basic Multilingual Plane):0x0-0xFFFD(前16bit)集中了大多现代书写系统

2. SMP(Supplementary Mulitilingual Plane):0x10000-0x1FFFD 包括了大多在历史上曾经使用的书写系统

3. SIP(Supplementary Ideographic Plane):0x20000-0x2FFFD 用于每年新增加的象形文字

4. SSP(Supplementary Special-Purpose Plane):0xE0000-0xEFFFD 存放一些争议性比较大的字符(语义上比较模糊或者会给文字处理带来麻烦)

5. 保留区:0xF0000-0xFFFFD & 0x100000-0x10FFFD 任何人都可以私自定义这个区域

Note: 特殊字符编号0xFEFF是BOM(Byte Order Mark),包括它对判断Byte Order有特殊用途,所以它的另外一面0xFFFE也就被规定为非Unicode字符

 

对于超过16bit的unicode,USC2的处理方法(参考UTF-16, an encoding of ISO 10646):

只保留低16位信息,忽略高5位的信息。

解决方法是在BMP中划分出两个保留区域,分别是0xD800-0xDBFF的High Surrogate Area和0xDC00-0xDFFF的Low Surrogate Area。编码方案是,假如有一个大于0xFFFF的code point是X,那么让Y=X-0x10000;Y显然是介于0x00和0xFFFFF之间的20bit数据(这也就是为什么unicode虽然扩展到 21bit,但只有17个plane——理论上21bit可以表示32个plane)。假如Y这个数字的分隔为高10bit和低10bit(假如是 xxxxxxxxxxyyyyyyyyyy),那么X的UTF16编码110110xxxxxxxxxx 110111yyyyyyyyyy,正好落在Surrogate Area里面。就这样UTF16变成了长度可变编码。

                        low = ((ch - 0x00010000) & 0x3FF) + 0xDC00;
                        hi  = (((ch - 0x00010000) & 0xFFFFFC00) >> 10) + 0xD800;

 

refernce:

1. unicode 官网:

2. 复杂的unicode:http://www.blogjava.net/pts/archive/2009/07/20/287506.html

3. UTF-16, an encoding of ISO 10646: 

阅读(993) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~