字符编码
计算机底层只能表示二进制信息,不能直接表示文字。计算机显示给我们看的文字可以看做是很小的一张张字符的图片。图片信息量非常大,但如果文字都以图片进行存储和传输,效率会变得很低。
所以计算机科学家将这些单个字符图片放到一个文件中,这个文件就是字体文件。再给每个字符一个编号,存储传输时就用字符的编号。这个编号表就是字符编码(简单这么理解)。
文本文件存储的就是每个字符的编号,计算机在打开文本文件时,会根据指定的编码,去编码表中查询一个一个的字符,再渲染给用户。
常用的字符编码有:
- ascii码
- gb2312码
- gbk
- unicode
- utf-8
ascii码
标准的ascii码包含26个大小写字母,阿拉伯数字0-9以及常用的标点符号等128个字符,通过计算使用7位二进制数就可以表示,扩充后调整为8位,即一个字节。编码详情如下:
例如在ascii编码表中,字符A的编码为65
,当在文件中存入字符A
时,实际计算机存储的是编码65,打开文件时,计算机会根据编码去字体文件中找到字符A
。
在记事本中键入abc123+-*/
,然后使用HexEditor打开后发现跟上面的编码表是一致的。
gb2312
当计算机发展到欧洲以外的其他国家和地区后,为了能够使用自己国家的文字,各国发明了自己国家的字符编码。
我国在1980年发布了gb2312码
,gb2312
是一个简体中文字符集,由6763个常用汉字和682个全角非汉字字符组成。
使用一个字节不足以表示gb2312码,因此,在gb2312中使用两个字节表示一个汉字。
gbk
GB2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。
GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
gbk也是使用两个字节表示一个汉字。
unicode
世界上存在着多种编码方式,同一个编码值,在不同的编码体系里代表着不同的字。要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。
我上大学时玩电脑游戏遇到最多的问题就是乱码。
以日文的编码方式创建一个文本文件写入やめて
,然后用记事本打开会显示如下:
这个问题促使了unicode码的诞生。
unicode将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。
Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
将之前写有abc123+-*\
的文件用记事本另存为unicode会发现文件的体积大了一倍。(本来应该是4倍,windows上没有USC-4标准)
utf-8
为了提高Unicode的编码效率,于是就出现了UTF-8编码。
UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。
"汉"字的Unicode编码是U+00006C49,然后把U+00006C49通过UTF-8编码器进行编码,最后输出的UTF-8编码是E6B189。
utf-8中汉字使用3个字节存储。