字符集和编码方式

字符集:符号与控制符的集合以及与二进制的对应关系

编码方式:计算机读取与存储字符集中字符的规则

比如ASCii字符集有128个字符,其中‘A’对应的是十进制65,ASCii编码方式则是用首位为0的一个字节表示每个字符,计算机只要依次读取单字节并将后七位与字符集比较,就能读懂该字节含义

ASCii:包含128个字符

iso-8859-1:包含256个字符,向下兼容ASCii即它的1~128与ASCii一样

ANSI: 一种扩展的ASCII码,每个国家不一样,中文简体就是ASCII+GBK,繁体字的是Big5,日语的是Shift_JIS

Unicode

现在最重要的当属Unicode字符集(兼容ASCii),它将世界上几乎所有的字符都包含其中,比如汉字‘严’对应的Unicode码是十六进制4E25。现在缺的就是一个编码方式来实现这个字符集。

设计编码实现的时候遇到一个问题:作为一个规模极大的字符集很可能有些字符用一个字节甚至几位就能表示而有些需要好几个字节来表示。假设字符集最后一个字符必须用4个字节的长度表示,那我们是不是规定用4个字节来表示每个字符,前面空的都置0;

当然这是很不合适(也有这样做的后面介绍)的这样会造成存储空间的极大浪费,而且我们常用的字符都是放在前面的也就是用较少的字节就能表示,那存储空间不可避免会保存大量的废数据0

utf-8

现在最常用的unicode的编码实现方式是utf-8,最大的特点是,他是一种变长的编码方式。它使用1~4个字节表示一个符号。

utf-8的编码规则有两条:

1.单字节字符,第一位为0,后7位为这个符号的unicode码

2.对于n字节的符号(n>1),首字节前n位为1、n+1位为0,其他字节一律以10开头,剩下的所有字节表示这个符号的unicode码

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

比如‘严’的Unicode码是4E25(100111000100101)在0800~FFFF的范围内,因此需要三个字节表示,这样‘严’的utf-8编码就是“11100100 10111000 10100101”,用十六进制表示就是E4B8A5

USC-2

unicode还有一种编码方式就是USC-2,即所有字符都用两个字节来表达,也就是notepad的中所谓的unicode,可以看到后面还有一种unicode big endian其实这是同一种编码方式两种不同的存储方式


little endian 和 big endian

这两个名字来自格列佛游记,书中,小人国爆发内战,战争的原因是国民对,吃鸡蛋从大头敲开还是从小头敲开产生分歧。

计算机中内存是有编号的,读取一个连续的内存是从编号小的开始读取。

比如:内存中编号为10、11的两个内存要存储ucs-2编码的Unicode码‘严’(4E25),

将高位4E存储在内存10中将25存储在内存11中这种高位先存的方式就是big-endian

反之则叫做little-endian

utf-8只有一种存储方式,因此计算机自然知道怎么读取存储,但是对于usc-2有两种存储方式,计算机就无从下手了。因此需要一个标示,big-endien 文件前两个字节是FE FF ,littile-endian则是 FF FE

猜你喜欢

转载自xiaoxiaoher.iteye.com/blog/2356295