字符编码
参考自:https://www.bilibili.com/video/BV12741127qm
计算机内部用晶体管表示0,1。所以用的是二进制。二进制转换成十进制就是我们用到的数字。
而计算机在显示字符方面,数字与字符之间的一一对应叫做字符编码。
最早的计算机在设计时以字节(byte)为基本存储单位,一字节占八个比特位(bit)。可以表示一个8位二进制数。即00000000(0)~11111111(256)。
美国国家标准学会(American National Standard Institute:ANSI)将常用的数字,字母和符号总结起来,一共127个,用256的容量表示绰绰有余。
所以就有了ASCII码,即美国信息交换标准代码。
但是,当计算机推广到全球,这套只能够存储256个字符的代码就不够用了。
比如中文就有10万多个,当计算机普及到中国时,这套代码完全不够表示中文。
于是中国在1980年发表了《信息交换用汉字编码字符集》,标准号GB 2312。
这套字符集用1~2个字节表示一个字符,是一套简体中文字符集,有6763个常用汉字和682个全角的非汉字字符。很快通行于中国内地。
但是这套标准还是不够表示所有中文,一再扩展。最后在1995年中华人民共和国制定了《汉字内码扩展规范》,即GBK字符集。
其包含了GB 2312的所有字符,并在此基础上增加了两万多个汉字(包括繁体)和符号。
后来少数民族也要用电脑了,GBK就扩展成了GBK18030,又加了几千个新的少数民族的字。
这样看来,GBK18030兼容GBK,GBK兼容GB 2312,GB 2312兼容ASCII码。所以中英文在计算机中得以显示。
既然一个字节的ASCII码和两个字节的汉字都可以表示出来,那么计算机又是如何识别一个字符是单字节字符还是双字节字符呢?
我们知道一个字节能表示的最大数是 2 8 2^{8} 28,也可以写成 1 6 2 16^2 162,所以用两个16进制数来表示一个字节很方便。127用16进制表示为7F,ASCII码一共包含127个字符,所以当第一个字节小于7F时,计算机认为它是ASCII字符;当第一个字节大于7F时,计算机就认为该字符是GBK双字节字符。
再放眼全世界,每个国家都有每个国家的文字和编码方式。这时候如果你打开一个全是日文的网站,你用GBK编码肯定就全是乱码,你不得不下载一份日文编码。
这时候如果你去看一个多语言的网站,乱码就不可避免。
所以1990年,国际标准化组织ISO开始研发一套通用的标准字符集。
在1994年推出unicode标准,该标准为每一种语言的每一个字符设定了统一并且唯一的二进制编码,以满足跨语言,跨平台的文本转换需求。
可以看到Unicode标准还有很大的空间未使用。
在Unicode标准中保留了部分用户自定义标准区,这里可以保存用户自定义的符号。比如微信的小表情。
Unicode标准只是为了统一字符而定义的一套标准,它可以有很多种实现方式。
比如最常见的就是UTF-8(Unicode/UCS Transformation Format)。当然还有UTF-16、UTF-32。
UTF-8是Unicode的一种储存,传输方式,是一种可变长编码方式。他的长度可以是单字节,双字节,三字节以及四字节。
如果将英文字符转换成UTF-8,与ASCII完全一致。所以ASCII码可以看做是UTF-8的一部分。
在cmd中输入chcp可以查看计算机的编码方式。
C:\Users\lenovo>chcp
活动代码页: 936
比如我在中国大陆,代码是936,936表示GBK字符集。
当使用记事本写入汉字,以ANSI编码(即计算机默认编码GBK)保存后,再用sublime Text打开我们会发现乱码了。因为Sublime text不支持GB2312和GBK编码,汉会被当成UTF-8编码进行转换,就会出现乱码。这个时候可以安装插件ConvertToUTF8
。
参考:https://segmentfault.com/a/1190000009611209