一、什么是字符编码?
引入
-
文本文件:
文本文件是指由字符构成的文件,如我们写的python脚本文件、txt类型的文本文件等。当我们使用文本编辑器(如vs code)打开时,呈现的是一个个人类可以读懂的文字。
-
二进制文件:
如图片、视频等类型的文件被称为二进制文件,当我们使用文本编辑器打开时,呈现的是乱码。
二进制文件的处理十分复杂,本文不做更多的说明!仅在文本文件范围内讨论!
虽然文件被这样分类,但实际上所有文件在计算机内部,都是由 0101011 这样的二进制位构成的,想要使用它们,还需要计算机做进一步的处理。
解码、字符编码、编码的概念
-
解码
当我们打开文本文件时,计算机会根据文件的类型,对文件进行一些处理。比如,将一个txt文件由二进制转换为人类可以读懂的文字,这个过程被称为解码。
-
字符编码
而在解码过程中,计算机要依赖于一些规则,将指定的二进制位解码为指定的字符,比如:0110 0001被解码为 小写英文字母 a 。而这个规则被称为字符编码。字符编码有很多种,而前面的例子中用到的编码叫做 ASCII 编码,它是最早产生的字符编码。
-
编码
当然 从字符转换为二进制位 也要使用字符编码,而这个过程被称为编码。
二、字符编码的发展史
阶段一:一家独大
起初,美国科学家在设计字符编码的时,只考虑了使用英语的场景,发明的ASCII编码使用8个二进制位来表达一个字符,只支持现代英语和其他西欧语言,不支持汉语等语言。
-
部分ASCII对照表:
二进制 十进制 十六进制 字符 0110 0001 97 61 a 0110 0010 98 62 b 0110 0011 99 63 c 0110 0100 100 64 d 0110 0101 101 65 e 0110 0110 102 66 f 0110 0111 103 67 g 0111 1011 123 7B { 0111 1100 124 7C | 0111 1101 125 7D }
阶段二:群雄割据
为了让计算机识别中文字符,中国科学家发明了GBK字符编码,该字符编码使用16位二进制位(但有些生僻字还是不支持),且仅支持英语和汉语。
另一方面,世界上很多国家为了支持本国的语言,各自发明了字符编码,如:日本的Shift_JIS、韩国的Euc-kr等。
尽管有如此多的字符编码,但没有一个是通用的,它们大多都只支持本国语言和英语。
阶段三:天下归一
为了实现对所有语言的支持,国际组织ISO制定了unicode字符编码,也叫万国码。支持各国语言,使用16~32位二进制位来对应一个字符。
现代计算机都使用Unicode字符编码。之前的如GBK等编码可以转换为Unicode编码。
虽然unicode使得字符编码统一了,但它占用的空间也更大,浪费空间,同时影响数据,加大了速度传输量。并且,Unicode只是在内存中给出了各种字符的通用映射规则,并没有指定字符如何保存到外存(如硬盘)中。
为了解决以上问题,出现了utf系列的字符编码。UTF是针对Unicode实现的一种可变长度字符编码,比unicode更加精简,给出了字符保存的编码规则。这些编码中,最常用、应用最广的就是utf-8,使用的位数不固定,最小为8位。
至此,utf-8编码成了最流行的字符编码,我们在开发中也应该尽量使用utf-8编码。