Skip to main content
  1. posts/

(中文)文本的字符编码

·1 min

字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称。
字符编码(Character Encoding):是指一种映射规则,将符号转换为计算机可以接受的数字系统的数字代码。
常见字符集名称:ASCII 字符集、GB2312 字符集、BIG5 字符集、GB18030 字符集、Unicode 字符集等。

ASCII
上个世纪 60 年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系做了统一规定,这被称为 ASCII 码,后来它被国际标准化组织定为国际标准并一直沿用至今。
ASCII 码一共规定了 128 个字符的编码,这 128 个符号(包括32个不能打印出来的控制符号)只占用了一个字节的后面7位(用0 ~ 127来表示),最前面的一位统一规定为 0。

Unicode
世界上存在着多种字符,为了将世界上所有的符号都给予一个独一无二的编码,Unicode 应运而生。它是一个很大的集合,现在的规模可以容纳100多万个符号,具体的符号对应表,可以查询 unicode.org。兼容 ASCII 编码。
Unicode 只是一个符号集,并没有规定这个二进制代码应该如何存储。这就有两个严重的问题:第一个问题是如何才能区别 Unicode 和 ASCII ?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是如果用来储存太浪费空间,我们知道 ASCII 编码只需要一个字节(8位)表示英文字母就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0,这对于存储来说是极大的浪费。编码规则 UTF-8、UTF-16、UTF-32 由此诞生。

UTF-8(Unicode Transformation Format,可变长度编码)
在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。对英文字符使用1个字节,中文字符通常使用3个字节编码。
Unicode 编码中表示字节排列顺序的那个文件头,叫做 BOM(byte-order mark)。UTF-8 文件的 BOM 是“EF BB BF”,但是UTF-8 的字节顺序是不变的,因此这个文件头实际上不起作用。有一些编程语言是 ISO-8859-1 编码,所以如果用 UTF-8 针对这些语言编程序,就必须去掉 BOM,即保存成“UTF-8—无BOM”的格式才可以,PHP 语言就是这样。

中文字符编码主要包括:

GB2312 又称国标码,中国最早发布的简体中文字符集编码标准,由国家标准总局发布,1981年5月1日实施,适用于汉字处理、汉字通信等系统之间的信息交换,通行于大陆,新加坡等地也使用此编码。它是一个简化字的编码规范,也收录了拉丁字母、希腊字母、日文平假名及片假名、俄语西里尔字母等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共收录有6763个汉字,其中一级汉字3755个,二级汉字3008个。中国大陆几乎所有的中文系统和国际化的软件都支持 GB2312。
GB2312编码规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。

GBK 是 GB2312 的扩展,不仅包含 GB2312 的所有字符,还包含繁体字的编码及一些其他字符,同样使用2个字节编码。GBK 中有码位23940个,收录了汉字21003个。
它是由厂商微软利用 GB 2312-80未使用的编码空间,收录 GB 13000.1-93全部字符制定了 GBK 编码。最早实现于 Windows 95简体中文版。虽然 GBK 收录 GB 13000.1-93 的全部字符,但编码方式并不相同。GBK 自身并非国家标准,只是曾由国家技术监督局标准化司、电子工业部科技与质量监督司公布为“技术规范指导性文件”。原始 GB13000 一直未被业界采用,后续国家标准 GB18030 技术上兼容 GBK 而非 GB13000。

GB18030 是一个更全面的汉字编码标准,字符集远比 GBK 大,最多可定义161万个字符,支持的汉字数量更多,包括了 CJK 统一汉字、少数民族文字等,共收录汉字70,244个。与 UTF-8 相同,采用多字节编码,每个字符可以由1个、2个或4个字节组成;本规格的初版是中华人民共和国信息产业部电子工业标准化研究所起草,由国家质量技术监督局于2000年3月17日发布。现行版本为国家质量监督检验总局和中国国家标准化管理委员会于2005年11月8日发布,2006年5月1日实施。此规格为在中国境内所有软件产品支持的强制规格。

Big5 又称大五码,每个汉字由两个字节构成,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。Big5 虽普及于台湾、香港与澳门等繁体中文通行区,但长期以来并非当地的国家标准,而只是业界标准。倚天中文系统、Windows 等主要系统的字符集都是以 Big5 为标准,但厂商又各自增加不同的造字与造字区,派生成多种不同版本。2003年,Big5被收录到 CNS11643 中文标准交换码的附录当中,取得了较正式的地位,这个最新版本被称为 Big5-2003。

中文码分为内码及交换码两类,Big5 属中文内码,知名的中文交换码有 CCCII、CNS11643。

常见中文编码之间的兼容性:GB18030 > GBK > GB2312 > ASCII,UTF8 > ASCII, 所谓兼容性可以简单理解为子集,ASCII 被所有编码兼容,而最常见的 UTF8 与 GBK 之间除了 ASCII 部分之外没有交集。
即 Unicode、GBK 和 Big5 码等字符集是不兼容的,GBK、GB2312 等与 UTF8 之间都必须通过 Unicode 编码才能相互转换:
1)GBK、GB2312 –先转–> Unicode –再转–> UTF8
2)UTF8 –先转–> Unicode –再转–> GBK、GB2312

根据不同场景的需要选择合适的编码方式。例如,在处理简体中文内容时,可能优先考虑 GB2312 或 GBK;若需兼容更广泛的字符集,尤其是涉及多语言环境时,UTF-8 是更为通用的选择。