您的位置:首页 > 其它

关于各种编码

2012-03-30 16:42 211 查看
历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。前者开发的 ISO/IEC 10646
项目,后者开发的统一码项目。因此最初制定了不同的标准。

1991年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码;ISO也承诺,ISO 10646将不会替超出U+10FFFF的UCS-4编码赋值,以使得两者保持一致。两个项目仍都存在,并独立地公布各自的标准。但统一码联盟和ISO/IEC JTC1/SC2都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。例如UTF-16是ucs-2的父集,UTF-16第一辅助面表示就是ucs-2。UTF-32和ucs-4更是相差无几。
一:Unicode编码
Unicode计划使用了17个平面,一共有17*65536=1114112个码位。如下:
 

平面
始末字符值
中文名称
英文名称
0号平面
U+0000 - U+FFFF
基本多文种平面
Basic Multilingual Plane, 简称 BMP
1号平面
U+10000 - U+1FFFF
多文种补充平面
Supplementary Multilingual  Plane, 简称 SMP
2号平面
U+20000 - U+2FFFF
表意文字补充平面
Supplementary Ideographic  Plane, 简称 SIP
3号平面
U+30000 - U+3FFFF
表意文字第三平面(未正式使用[1]
Tertiary Ideographic Plane, 简称 TIP
4号平面

  至

  13号平面
U+40000 - U+DFFFF
(尚未使用)
14号平面
U+E0000 - U+EFFFF
特别用途补充平面
Supplementary  Special-purpose Plane, 简称 SSP
15号平面
U+F0000 - U+FFFFF
保留作为私人使用区(A区)[2]
Private Use Area-A, 简称 PUA-A
16号平面
U+100000 - U+10FFFF
保留作为私人使用区(B区)[2]
Private Use Area-B, 简称 PUA-B
 

在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。平面0也有一个专用区:0xE000-0xF8FF,有6400个码位。平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域(这个代理区的目的用两个UTF-16字符表示BMP以外的字符。在介绍UTF-16编码时会介绍)。
unicode的集中编码方式:UTF-8,UTF-16,UTF-32,UTF-8是变长的。UTF-16是2或四个字节,UTF-32是4个字节。16和32无法和asc码对应。此外Unicode的实现方式还包括UTF-7PunycodeCESU-8SCSUUTF-32GB18030等。在非Unicode环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非Unicode的字符编码转换为同一字符对应的系统内部使用的Unicode编码。可以在“语言与区域设置”中选择一个代码页作为非Unicode编码所采用的默认编码方式,如936为简体中文GBK,950为正体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道,但目前尚无法做到这一点。代码页技术现在广泛为各种平台所采用。UTF-7的代码页是65000,UTF-8的代码页是65001。
1.UTF-8
UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
 

Unicode编码(16进制)
UTF-8 字节流(二进制)
000000 - 00007F
0xxxxxxx
000080 - 0007FF
110xxxxx 10xxxxxx
000800 - 00FFFF
1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
 

UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
2.UTF-16
UTF-16可以被实现为UTF-16LE或UTF-16BE
第一个Unicode平面(码位从U+0000至U+FFFF)包含了最常用的字符。该平面被称为基本多语言平面,缩写为BMP. UTF-16与UCS-2编码这个范围内的码位为单个16比特长的码元,数值等价于对应的码位. BMP中的这些码位是仅有的码位可以在UCS-2被表示.编码数值和unicode相同。
辅助平面UTF-16要用四个字节表示,基本多语言平面内,从U+D800到U+DFFF之间的码位区段是永久保留不映射到字符,因此UTF-16利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。编码如下
 

DC00
DC01
   …   
DFFF
D800
10000
10001

103FF
D801
10400
10401

107FF
  ⋮




DBFF
10FC00
10FC01

10FFFF
 

3.UTF-32
UTF-32可以被实现为UTF-32LE或UTF-32BE。四个字节比较简单,编码值直接与unicode对应。
 
4.示例:
 

Unicode编码
UTF-16LE
UTF-16BE
UTF32-LE
UTF32-BE
0x006C49
49 6C
6C 49
49 6C 00 00
00 00 6C 49
0x020C30
43 D8 30 DC
D8 43 DC 30
30 0C 02 00
00 02 0C 30
 

例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
BYTE data_utf8[] = {0xE6, 0xB1, 0x89,0xE5, 0xAD, 0x97}; // UTF-8编码
WORD data_utf16[] = {0x6c49, 0x5b57}; //UTF-16编码
DWORD data_utf32[] = {0x6c49, 0x5b57}; //UTF-32编码
 
 
 
 
 
 
 
 
windows下c&c++编译器默认是使用gb2312编码的。如读取文件或定义字符串默认是gb2312,ide的显示也是默认识别gb2312。但定义wchar_t时候默认是unicode编码的,ide环境也是能识别并显示unicode编码的。.linux下c&c++编译器默认是使用utf-8编码的。如读取文件或定义字符串默认是utf-8,(没有使用ide时候,显示终端有可能只支持utf-8故读取的其他格式不能正确显示)。同样定义wchar_t时候默认是unicode编码的,(没有使用ide环境时候,尚不知道能不能识别并显示unicode编码)。
注:vs选择多字节字符集(ansi)和unicode字符集,表示编译的结果用什么格式存放,便于移植。UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息