字符编码
我们知道,计算机只能存储0或者1,对于英文字母或者汉字来讲,我们是无法将其直接存储在计算机中的,需要给这些字符编码,编码由0和1组成,这样就可以存储在计算机中了。随着计算机的发展,世界上出现了各种不同的编码,这篇文章将对ASCII码、GB2312、Unicode、UTF-8进行探讨。
1、ASCII码
计算机最初是在美国发展起来的,美国使用英语,英语共有26个字母,于是美国人就是用1个字节对这26个字母进行编码,如将字符‘A’编码为01100001。一个字节为8位,总共可以有256个编码,ASCII码只使用了这8为中的低7位,并将最高位置0,这样可以产生128个字符编码,除去英文字母所用的26个编码,还包含了一些符号的编码,如将%编码为01000101,以及一些控制字符的的编码,如将换行(LF)编码为00001010。这样的一套编码被称为ASCII码,全称为American Standard Code for Information Interchange,即美国信息交换标准代码。
2、GB2312
计算机传入中国后,人们发现一个字节的编码已经全部被占用(最高位为0的128个为ASCII码,最高位为1的128个为其他西方国家语言的编码),而且一个字节的也不可能将所有汉字编码,于是我们做了一个规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。结果后来发现GB2312所编码的汉字还是不够用,于是又在GB2312的基础上发展出了GBK编码。
3、Unicode
当各个国家或地区都搞出自己的一套编码的时候,结果就会发生我在一台机器上的文本放到另一台采用不同编码的机器上文本内容会变乱码的情况。比如我用简体中文(使用GB2312编码)写了一份邮件发送到香港,而香港使用繁体中文(使用Big5编码),这时邮件中就会出现乱码现象。为了解决类似的问题,国际标准化组织ISO提出了一套包含全球所有文字、所有符号的编码,每个文字或符号的编码独一无二,他们称这套编码为Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。Unicode又被称为 统一码、万国码、单一码,它是为了解决传统的字符编码方案的局限性而产生的,它为每种语言中的每个字符设定了统一并且为之一的二进制编码。Unicode编码最少占用2个字节,对于ASCII码中的编码保持不变,只是在高位增加一个全为0的字节。
需要注意的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
4、UTF-8
Unicode虽然解决了乱码的问题,但又带来了新的问题:存储空间上升。假如有一个全是英文字符的文件,那使用Unicode编码的该文件比使用ASCII码编码的该文件体积增加一倍,另一个问题是无法区分Unicode与ASCII码,计算机怎么知道2个字节是一个符号而不是两个符号呢。这时UTF-8应运而生,UTF-8并不规定每个字符至少占用两个字节,而是使用如下方法编码:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
这样就解决了Unicode的问题。
5、Unicode和UTF-8的关系
Unicode给每个字符一个唯一的id,UTF-8对这个id根据一定的规则进行编码存储。UTF-8是Unicode的一种实现方式,其他方式还有UTF-16,UTF-32等。可以这样理解:汉字严
的Unicode编码为4E25
,二进制位100111000100101
,其UTF-8编码为E4B8A5
,所以当我们向文本输入汉字严
的时候,就相当于输入了其Unicode编码100111000100101
,而通过UTF-8方式进行存储时,严
就被存储为E4B8A5
。
6、参考
1、http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
2、https://www.zhihu.com/question/23374078
3、https://www.cnblogs.com/zhangqigao/p/6496172.html