关于各种编码
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个码位。如下:
在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-7、Punycode、CESU-8、SCSU、UTF-32、GB18030等。在非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的编码方式如下:
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区段的码位来对辅助平面的字符的码位进行编码。编码如下
3.UTF-32
UTF-32可以被实现为UTF-32LE或UTF-32BE。四个字节比较简单,编码值直接与unicode对应。
4.示例:
例如,“汉字”对应的数字是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位。
项目,后者开发的统一码项目。因此最初制定了不同的标准。
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-7、Punycode、CESU-8、SCSU、UTF-32、GB18030等。在非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位。
相关文章推荐
- 关于各种编码问题,汉字处理的一点小总结
- 信号与系统课程中关于各种编码MATLAB仿真的绘图函数
- 关于BASE64,以及网上收集的各种编码解码实现
- 又一篇关于各种音视频编码的
- 关于各种编码的简要理解
- 关于String中各种编码中文字符的字节长度
- 关于计算机中的各种编码
- 关于XMLHTTP对象返回编码问题的各种方法整理
- 关于各种编码
- 关于 java中各种编码问题
- 关于.JS文件保存编码格式的问题-兼容各种语言版本
- 关于Java中各种字符编码格式的说明
- 关于各种编码的区别
- 关于字符串编码及其正确IO的各种讨论
- 各种编码UNICODE、UTF-8、ANSI、ASCII、GB2312、GBK详解
- 关于SMS编码Delphi源码摘抄
- 【转】关于C++程序的编码问题
- 关于相对布局RelativeLayout的各种属性介绍
- 关于微店整合微信支付时出现的的各种问题的记录 php版
- 关于各种无法解析的外部符号/命令问题的相应解决方案(fatal error LNK1120)