关于各种编码

历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(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-8UTF-16UTF-32UTF-8是变长的。UTF-162或四个字节,UTF-324个字节。1632无法和asc码对应。此外Unicode的实现方式还包括UTF-7PunycodeCESU-8SCSUUTF-32GB18030等。在非Unicode环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非Unicode的字符编码转换为同一字符对应的系统内部使用的Unicode编码。可以在语言与区域设置中选择一个代码页作为非Unicode编码所采用的默认编码方式,如936为简体中文GBK950为正体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道,但目前尚无法做到这一点。代码页技术现在广泛为各种平台所采用。UTF-7的代码页是65000UTF-8的代码页是65001

1.UTF-8

UTF-8以字节为单位对Unicode进行编码。从UnicodeUTF-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字节模板有21x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。

2.UTF-16

UTF-16可以被实现为UTF-16LEUTF-16BE

第一个Unicode平面(码位从U+0000至U+FFFF)包含了最常用的字符。该平面被称为基本多语言平面,缩写为BMP. UTF-16与UCS-2编码这个范围内的码位为单个16比特长的码元,数值等价于对应的码位. BMP中的这些码位是仅有的码位可以在UCS-2被表示.编码数值和unicode相同。

辅助平面UTF-16要用四个字节表示,基本多语言平面内,从U+D800U+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-32LEUTF-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

 

例如,汉字对应的数字是0x6c490x5b57,而编码的程序数据是:

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字节模板有21x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值