您的位置:首页 > 其它

各种编码方式及其来历

2017-09-20 11:13 495 查看
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)。

最早出现的编码方式,以7bit来表示一个字符,共计表示128种字符(2的7次方)。

美国作为发明计算机的国家,当初设计的的编码方式完全是为自己国家服务,对付英文/数字/标点完全没问题。

ISO-8859-1

以8bit来表示一个字符(即1个字节byte表示一个字符),共计表示256种字符(2的8次方)。完全兼容ASCII,即ASCII显示的字符,ISO-8859-1也完全能显示

随着计算机的发展,ASCII已经不满足非英语的西方国家(如德国、法国),所以出现了ISO-8859-1编码方式

gb2312

以2个字节(16bit)表示一个字符

gb->国标。随着计算机引入到中国,计算机的编码方式不能显示中文,于是中国自己创造了一个编码方式,用于显示中文

gbk(国标扩展)

以2个字节(16bit)表示一个字符

由于gb2312设计的时候,不能表示一些生僻字,为了展示这些生僻字,gbk就应运而生了

gb18030

以4个字节(32bit)表示一个字符

gbk用到后面发现,还是不能表示所有的中文,就增加了这种新的编码方式。目前是最完整的汉字表示形式(简体中文)

big5

以2个字节(16bit)表示一个字符

繁体中文的表示形式,台湾等地区使用较多,跟gb系列没有任何关系

由于各个国家都有自己的编码方式,国际标准组织就出了一个规范,统一所有国家的编码,这个编码方式就是unicode(\uxxxx)

unicode规定了字符集之后,由不同的实现方式,衍生出不同的编码方式

目前Unicode的占用字节数是1到6个字节

UTF-16

统一采用2个字节(16bit)表示一个字符

这是Unicode的第一个版本,能表示65536个字符,
UTF-16的存储形式,跟Unicode定义的字符集是一样的

举个例子:

“汉”这个字,在Unicode的编码是 01101100   01001001

则在UTF-16中,这个字在硬盘中存储的形式就是 01101100   01001001
说到UTF-16,就不得不说说UTF-16中蛋疼的LE(little endian)和BE(big endian)了,

还是这个例子,“汉”这个字的编码,

如果是LE的形式存储,就是:01001001 01101100 ,刚好把2个字节反过来了(据说这是为了迎合cpu的读取速度,cpu就是倒着吃数据的)

如果是BE的形式存储,就是:01101100  01001001

怎样区分一个文件是以LE形式存储还是以BE形式存储呢?简单,一般UTF-16格式存储的文件里,文件开头有个俗称为“Zero Width No-Break Space”的东西(其实就是一个字符,并且该字符无法看见),如果该字符为 0xFFFE,该文件就是LE形式的,如果为0xFEFF,则为BE形式的

UTF-8(Unicode Translation Format)

采用1到6个字节表示一个字符(编码Unicode字符)

UTF-16出现以后,已经解决编码不统一的问题了,然而,对于英美国家来说,UTF-16就显得太笨重了,因为我就是需要1个字节就能表示的,你偏要我用2个字节表示,这对存储空间就造成了很大的浪费(相当于一个文件的大小翻倍了),好了,我们现在最常用的编码方式终于闪亮登场——UTF-8。

UTF-8存储Unicode的方式比较复杂,程序把一个字节一个字节的来读取,然后再根据字节中开头的bit标志来识别是该把1个还是2个或3个字节做为一个单元来处理.

0xxxxxxx,如果是这样的01串,也就是以0开头后面是啥就不用管了XX代表任意bit.就表示把一个字节做为一个单元.就跟ASCII完全一样.

110xxxxx 10xxxxxx.如果是这样的格式,则把两个字节当一个单元

1110xxxx 10xxxxxx 10xxxxxx 如果是这种格式则是三个字节当一个单元

确定了一个字符用多少个字节以后,直接把该字符的Unicode编码逐个替换进UTF-8的格式里去就行了

综合起来,一个字节的字符有128个(7个X,2的7次方),两个字节的字符有2048个(11个X,2的11次方),3个字节的字符有131072个(17个X,2的17次方),以此类推

有点抽象,还是上面那个例子,“汉”这个字,在Unicode的编码是 01101100   01001001,用十进制表示就是27721,27721>2048并且27721<131072,所以,该字使用3字节长度的UTF-8,UTF-8编码之后,存储形式为:

11100110 10110001 10001001

所以,UTF-8用一个字节表示英文字母或者数字,完全兼容于ASCII。一般用3个字节表示一个中文

UTF-32

统一采用4个字节(32bit)表示一个字符

这是Unicode的第二个版本,因为发现2个字节已经满足不了字符的展示了。其他说明跟UTF-16类似,与UTF-8的关系也跟UTF-16类似

参考文章:http://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编码 标准 unicode