在和前端同事沟通对字符长度的判断方式时,发现有相当一部分同事对为什么使用UTF-8和为什么有ASCII、GB、Unificode、UTF-8这些字符编码缺乏足够的了解,因此整理了一份资料,供大家学习参考。
为什么有字符编码?
计算机只能识别二进制数(0和1),人类使用计算机的时候,希望可以更符合人类的思维,因此产生了字符编码,即人类字符对应计算机二进制数的对照表。
说白了,方便人类使用计算机。
字符(character):字符是人类文明创造的符号,汉字、英文字母、标点符号、特殊符号都是字符。
字节(byte):计算机存储数据的基本单位。
为什么会出现多种字符编码?
还是因为计算机的发展历史,随着计算机的普及,越来越多不同国家开始加入使用,语言不同,对应的字符编码也不同,因此出现了各种字符编码。
在互联网时代,这种字符编码的统一需求,迫使人类选择了Unicode(统一编码标准)
以中国为例:
中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。
汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。
中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。
终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。
所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。
于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。
ASCII
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)
是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言(计算机是美国发明的)。
ASCII 由电报码发展而来。
第一版标准发布于1963年[3][4],1967年经历了一次主要修订[5][6],最后一次更新则是在1986年,至今为止共定义了128个字符;
GB
1. GB 2312
中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,
通常简称GB(“国标”汉语拼音首字母),又称GB0,由中国国家标准总局于1980年发布,1981年5月1日实施。
GB 2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB/T 2312。
GB 2312标准共收录6763个汉字,基本满足了汉字的计算机处理需要,但偏僻字等没有收录。
2. GBK
Guo-Biao Kuozhan 国家标准扩展码,GB是国标的汉语首拼音,K是扩展
由中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订
3. GB 18030
由国家质量技术监督局于2000年3月17日发布和实施。该标准在GBK基础上增加了CJK统一汉字扩充A的汉字。
其对GB 2312-1980完全向后兼容。
本规格第一版 GB 18030-2000
本规格第二版为 GB 18030-2005
本规格第三版为 GB 18030-2022(目前最新)
GB 18030-2000,兼容Unicode 3.0中日韩统一表意文字(即扩展A区),共收27,533个汉字;2000年3月17日发布、2000年7月1日实施。
GB 18030-2005,更新至Unicode 3.1中日韩统一表意文字(即扩展B区),并刊载少数民族包括朝鲜文、蒙古文(包括满文、托忒文、锡伯文、阿礼嘎礼文)、德宏傣文、藏文、维吾尔文/哈萨克文/柯尔克兹文和彝文的文字。共有70,244个汉字;2005年11月8日发布、2006年5月1日实施。
GB 18030-2022,更新至 Unicode 11 中日韩统一表意文字(增补了基本区的 66 个字,并在扩展 A、B区的基础上增加了扩展 C、D、E、F 区),新增康熙部首,以及滇东北苗文、傈僳文、西双版纳新傣文、西双版纳老傣文、德宏傣文等少数民族文字以及蒙古文 BIRGA 符号,共收录汉字87,887个和汉字部首228个,比上一版增加录入了1.7万余个生僻汉字;于2022年7月19日发布、2023年8月1日实施。
Unicode
Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。
The Unicode Standard,其官方机构Unicode联盟所用的中文名称为统一码,又译作万国码、统一字元码、统一字符编码,是信息技术领域的业界标准。
其整理、编码了世界上大部分的文字系统,使得电脑能以通用划一的字符集来处理和显示文字,不但减轻在不同编码系统间切换和转换的困扰,更提供了一种跨平台的乱码问题解决方案。
从1991年10月开始至今,已发布了20几个版本,版本内容一般是增补字符。
UTF-8
UTF-8(8-bit Unicode Transformation Format)
unicode在很长一段时间内无法推广,直到互联网的出现,为解决unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。
UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
UTF-8最大的一个特点,就是它是一种变长的编码方式。
它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。
从unicode到utf-8并不是直接的对应,而是要过一些算法和规则来转换。
UTF-8相比GB,占用的空间更大,且GB是中国标准,目前仍有使用。
UTF-8,UTF-16,UTF-32。它们遵循UNICODE字符集标准,但却改变了它的字节存储方案。
总结
字符编码的不断更新,都是为了增补新的字符,使其可以在计算机中的被识别,统一字符编码规则,符合互联网的思想,全球共用同一套字符编码,避免不同国家、组织、机构之间无法识别对方文字的问题。
目前在开发中,大部分情况都是使用UTF-8字符编码,也就是1个汉字占3个字节的规则。
如果是国内开发,传输的汉字很多,为了提高传输效率,可以考虑使用GB 18030编码规则,但跨平台时的字符乱码问题也需要考虑。