前言
中文编程界的汉字编码问题,每一个小白的血泪史,每一个小白在处理中文文件时,都无数次想,如果这是一份纯英文的文件,可能现在早就下班在家洗澡了。
史前文明-ASCII码
每个程序员都知道,不论是你在手机上看到漂亮小姐姐,还是这篇博文中的文字,在计算机底层存储中都是又一串01编码组成的二进制文件。
虽然对于计算机来说高低电平来控制程序的执行逻辑是很方便的事情,但是人可读不懂复杂冗长的二进制文件,因此就需要制定一种编码规则实现二进制文件与人类文字的相互转换,ACSII码应运而生。
计算机最早是由美国人在使用,于是由他们制定了二进制编码中8bit为一个字节(0~255),划定了0-32的控制码、26个大小写英文字母以及若干个英文符号的二进制编码,将一个字节使用到了127号,因此在ASCII码中一个字节就是一个英文字母,很好计算。美国人将这种编码方式命名为 ANSI(American National Standards Institute,美国国家标准学会) 的ASCII码,全称American Startand Code for Information Interchange,美国信息互换标准码。
随后很多欧洲国家也开始使用计算机,进而占用了一个字节的剩余128~255的位置,称为 ISO 8859-1,International Organization for Standardization(国际标准组织)。
汉字编码的军阀混战-GB2312、GBK、BIG5、JIS
GB2312,中国大陆编码规范
随后计算机逐渐在中国日本等国家流行开来,和之前面临同样的问题,中国也迫切需要一种编码方式将二进制按照某种规则翻译为汉字显示出来。但是和只有26个的英文字母不同的是,中文的每一个字都是一种新的写法,因此只能对每个汉字映射到一个二进制编码。而常用汉字就有6000多个,之前美国人定义的8bit=1字节完全不够用。于是人们想到了对于ASCII码进行扩展,用两个字节表示。并且将这种编码方式命令为GB2312(GB,Guóbiāo,中华人民共和国国家标准,简称国标,即国标2312)。
计算机在使用这种编码时,判断当前字节是否在0~127(ASCII码范围),如果在,则表示当前为单字节的英文字母;否则,会联合后面的一个字节共同判断当前的汉字表示(注意,在GB2312中两个字节都要大于127)。
整个过程用伪代码表示如下:
def decode(stream):
byte the_byte = stream.next_byte()
if 0 <= the_byte and the_byte <= 127:
return decode_english(the_byte) # decode english
byte next_byte = stream.next_byte()
if the_byte > 127 and next_byte > 127