计算机语言的巴别塔——ANSI Unicode编码

1.ASC II

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

2.ANSI

ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5。

3.GB2312 GBK GB18030

GB2312

一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE。

GBK

两个字节表示一个汉字,英文占一个字节,即全角半角。不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字。

GB18030

GB18030 编码是一二四字节变长编码。GB 18030与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个。单字节,其值从0到0x7F,与 ASCII 编码兼容。双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE(不包括0x7F),与 GBK标准基本兼容。四字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39。

4.Unicode

Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

固定用两个字节来表示,其中英文高字节补0

5.UTF-8

UTF-8以字节为单位对Unicode进行编码,UTF-8是Unicode的实现方式之一。

UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到UTF时并不是直接的对应,而是要过一些算法和规则来转换。

TF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。

Unicode编码(十六进制)   UTF-8 字节流(二进制)
00000000 - 0000007F 0xxxxxxx
00000080 - 000007FF 110xxxxx 10xxxxxx
00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8编码的最大长度是6个字节。从上表可以看出,6字节模板有31个x,即可以容纳31位二进制数字。Unicode的最大码位0x7FFFFFFF也只有31位。

“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

6.Little endian和Big endian

Unicode编码存储时,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

7.实例

新建一个文本文件,内容就是一个”汉“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。
然后,用文本编辑软件UltraEdit中的”十六进制功能“(Ctrl + H),观察该文件的内部编码方式。
1)ANSI:文件的编码就是两个字节“BA BA”,这正是“汉”的GB2312编码,这也暗示GB2312是采用大头方式存储的。
2)Unicode:编码是四个字节“FF FE 49 6C”,其中“FF FE”表明是小头方式存储,真正的编码是6C 49。
3)Unicode big endian:编码是四个字节“EF FF 6C 49”,其中“FE FF”表明是大头方式存储。
4)UTF-8:编码是六个字节“EF BB BF E6 B1 89”,前三个字节“E6 B1 89”表示这是UTF-8编码,后三个“E6 B1 89”就是“汉”的具体编码,它的存储顺序与编码顺序是一致的。

再在"汉"字后面加上一个英文字母a,a的ASC II码为61H,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。

1)ANSI:文件的编码就是两个字节“BA BA 61”,这正是“汉”的GB2312编码,这也暗示GB2312是采用大头方式存储的。
2)Unicode:编码是四个字节“FF FE 49 6C 61 00”,其中“FF FE”表明是小头方式存储,真正的编码是6C 49。
3)Unicode big endian:编码是四个字节“EF FF 6C 49 00 61”,其中“FE FF”表明是大头方式存储。
4)UTF-8:编码是六个字节“EF BB BF E6 B1 89 61”,前三个字节“E6 B1 89 61”表示这是UTF-8编码,UTF-8是一种变长的编码方式,所以c的ASC II码为61H,高字节不再补0。

再在‘a’的后面加上±,其扩展ASC II码为F1,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。

1)ANSI:文件的编码就是两个字节“BA BA 61 A1 C0”,这正是“汉”的GB2312编码,这也暗示GB2312是采用大头方式存储的。
2)Unicode:编码是四个字节“FF FE 49 6C 61 00 B1 00”,其中“FF FE”表明是小头方式存储.
3)Unicode big endian:编码是四个字节“EF FF 6C 49 00 61 00 B1”,其中“FE FF”表明是大头方式存储。
4)UTF-8:编码是六个字节“EF BB BF E6 B1 89 61 C2 B1”,前三个字节“E6 B1 89 61”表示这是UTF-8编码.

所以,根据结果来看,GBK Unicode UTF-8不再兼容扩展ASC II码,另根据其Unicode编码为’00 B1‘ 即:‘1011 0001’

将其转化为UTF-8,根据其属于

00000080 - 000007FF 110xxxxx 10xxxxxx 故将其自右向左一次填满,不足补0,即为‘1100 0010 1011 0001’转化为16进制就是:‘C2 B1‘就是它的UTF-8码



参考:http://blog.csdn.net/lvxiangan/article/details/8151670



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值