字体乱码这个问题相信大家都遇到过,但是都是间歇性的,不是经常性的,大多时候都没有太在意。
在遇到过这么多次乱码之后,特别是在linux下打开windows的文件乱码,我觉得有必要了解一下编码方式了。
首先,计算机内部只能存储二进制数据,即1和0的bit位。所以,我们要让计算机显示各种字符,就必须要对字符进行编码,让每一个字符对应一个数字编码。而之所以会造成乱码现象,是因为当初创建文件的时候采用的编码方式,和打开时的编码方式不一样,这样的对应关系就乱了,于是我们看到的就是乱七八糟的。
ASCII
计算机是美国人发明的,所以最初的计算机理所应当支持的就是英文字母以及英文里面的各种符号。由于这些字符不怎么多,美国人就提出了ASCII编码,只用一个字节(byte)表示一个字符。
unicode
随着计算机的发展,计算机只能显示英语是绝对不行的,要不然怎么有我现在的这篇文章呢?而并不是所有语言都像英语一样可以用一个字节表示一个字符(像我大中华便有好几万字符),于是各个国家纷纷开始提出自己国家文字的编码方式。但是世界上这么多国家,这么多语言,要是每个国家都有自己的标准,那一台计算机上不得有好多种编码方式啊,这会造成一种混乱。
这时,多语言软件制造商组成的统一码(unicode)联盟出手了,这个组织在1994年正式提出了unicode编码。正如unicode这个名字,它足以表示世界上所有语言中的字符,现在在世界上被广泛采用。
ISO/IEC 10646
在“统一”这个方面怎么能少的了ISO这个组织,在unicode联盟研发unicode时,ISO也在研发用于各种国家之间的编码方式,ISO定义了UCS(通用字符集),定义了ISO/IEC 10646。ISO和unicode联盟很快认识到研发两个不同的统一码是不必要的,所以他们选择了合作,于是现在它们从内容上来说是同步一致的。
UTF-8
UTF-8,UTF-16以及UTF-32都是unicode的实现方式。
对实现方式的理解:unicode编码使一个字符对应于一个数字编码,但是在计算机内部不是简单的存入这个编码值,这是为了对计算机中的内容进行更好的组织。所以就有了几种实现方式,将这些数字编码再映射到计算机内存中的二进制码。其中UTF-8就是在互联网的发展,强烈需求下产生的。
中文编码
在unicode提出之前,我国就已经提出了自己的汉字编码
- GB2312 1981年,GB是国标的意思
- BIG5 1984年台湾一群人为了解决当时大陆的GB2312没有覆盖繁体而提出的
- GBK 对国标的扩展,向下兼容GB2312,向上支持ISO/IEC 10646
- GB18030 我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准。
至于中国为什么使用自己规定的国标码而不使用unicode,这个问题我没有找到答案,有知道的在评论区告知一下呢?
乱码
Linux下默认是UTF-8,而windows可能是GB18030,于是这乱码就不奇怪了
还有各种奇奇怪怪的乱码原理都一样,可以通过转换编码的软件(比如enca)转文件的编码格式
大致就是这样了,这里我说的是编码方式,有一个概念叫字符集,规定了每个字符对应的编码,其实就是编码方式,把一件事搞清楚了就好了,不用纠结文字。
如果哪里写的不对,请各位大神们指出啊