字符编码
转载请说明出处,谢谢
2019-03-31
写作背景
由于最近要使用好几个文本编辑器编写文档,结果问题就来了,由于各个文本编辑器对字符编码支持不一导致乱码横生,无奈,对常见编码做一个整理以便了解及避免乱码问题。
为什么有编码
任何事物的诞生我总认为是有产生它的需求,那编码从何而来?
首先来探究一下编码是什么。对于我们人类所使用的符号,比如'+'、'-'、'*'、'/',电子计算机是不能直接识别的,那么为了让计算机表示这些字符就需要将我们所使用的符号转化为计算机可以识别的二进制码,我们可以将我们所使用的字符用唯一一串二进制数来表示,这样一一映射,我们使用的字符就和一个二进制码集对应起来,这个二进制串就称为码,这个过程可以称为编码。举个例子,比如我们要表示我们所用的A-Z这26个大写字母,那么我们至少需要5位二进制就可以完全表示这二十六个字母了,至于到底哪个字母用哪个5位二进制来表示,你可以自己定义,可是你自己定义的,别人不清楚是什么意思,但是如果你的编码做的很拽,推广很好,或许世界就接受了你的这套编码了。其实大家需要一个大家都接受的编码来供大家使用,提供这种规范的往往是各个标准机构,比如ANSI、ISO等。下面来看看几个使用比较广泛的字符编码。
常见编码
ASCII码与扩展ASCII码
首先搬上讲台的就是这个很著名的ASCII(American Standard Code for Information Interchange)码,即美国信息交换标准代码。由于早期的计算机由美国人发明的,用到的字符并不是很多,美国人就给自己常用的几个字符统一做了编码,采用7位二进制,共编码128个符号,其中有33个(0-31及127)表示控制或通信专用,剩余的95个表示字符,这就是ASCII码。有些计算机常识的人都知道,计算机存储的最小单位一般是8位二进制数,于是ASCII一般采用0开头加7位编码组成。具体编码见下表(ASCII码表,待补充):
起初的ASCII码表就只有128个编码,后来,欧洲一些国家也使用计算机了,但是他们的字符与美国的有些不一样,为了表示自己国家的特定符号,他们对8位ASCII码做了扩充,在考虑兼容的情况下,将最高位用1表示,又编写了128个码位,如此8位二进制就都有了特定的编码,这种码称为扩展ASCII码,比较著名的有IBM的扩展ASCII码,具体编码见下表:(扩展ASCII码表,待补充)
ANSI机构
计算机越来越普及,其他国家也需要对自己国家的语言或符号进行显示,为了和已有的ASCII兼容,各个国家就在ASCII码的基础上开始扩展自己的符号,可是请注意,这个时候各个国家之间可没商量怎么把两国的语言都编码进去,于是,各个国家都有了自己的一套编码,但兼容ASCII。这样一来,解决了本国符号显示的问题,但是又引入了新的问题,各个国家都有一套自己的编码,很大程度上就会出现一个码对应多个不同国家字符的问题,即扩展的编码不唯一,想想如果中国对0x8080定义了自己的一个符号,韩国也对0x8080定义了自己的一个符号,那这样的话,就不能在同一文档中同时显示中文和韩文两国符号了。因为你无法分辨这个0x8080是中文还是韩文。
这个时候ANSI机构来对各个国家的编码进行了规范,该机构根据每个国家或地域的符号做了一个叫做代码页(code padge)的编码,通过编码页来区分是用哪个地域的字符,然后就可以解决一个码对应多个符号的问题了,但是这样还是有问题,就是同一个文档中不同代码页的文字显示会冲突,ANSI准确来说是个机构,并不是一种编码,ANSI只是对各个国家自己的编码做了统一规范,它通过编码页把各个地域的字符区分,所以ANSI的这种作法并不给出一个统一的编码,当你在中国时,ANSI就对应中国汉字编码GB2312,到了韩国就成EUC-KR了,它是根据系统的local(可以理解为地域)来确定的。(待补充GB2312编码规则)
Unicode、UTF-8、UTF-16及UTF-32
后来,人们终于认识到各个国家都按照自己的编码来对于全球信息交流是个问题,于是有人就想着能不能对现有的所有符号进行一个统一的编码,那就是Unicode编码了。Unicode编码也是不断完善的,开始,Unicode使用两个字节对现有字符集进行统一编码,这样可以有65536个编码位,后来又纳入了更多的字符,两个字节不够了,Unicode就采用4个字节,和之前的保持兼容。这里请注意,Unicode只是对收纳的各个符号做了编码,对于怎么在计算机中存储是没有规定的。也就是说Unicode只是对符号做了一个唯一的身份号,这个号是4个字节。至于你怎么在计算机中存储不是Unicode的事情。简单来想既然Unicode是4个字节,那在计算机中直接用4个字节存储不就可以了,但事实确是对于像美国这样的国家来说,本来用ASCII码就够了,为何要多开辟这么多的存储空间呢,于是就有了按照不同方式存储的规范,如UTF-8、UTF-16及UTF-32,其中UTF-32就是按照上述想法来实现的。至于UTF,是UnicodeTransformationFormat的缩写,即Unicode转化格式,也就是说UTF-8、UTF-16及UTF-32是几种不同的Unicode转换格式,都是由Unicode转换而来,转换的目的就是为了不同的存储需求。
(待补充UTF-8、UTF-16及UTF-32编码规则)
总结
通过了解字符编码的发展,我理清了各个常见名词的区别,同时也认识到各个编码的优缺点,再接再厉。