✅常见的字符编码有哪些?有什么区别?
典型回答
就像电报只能发出"滴"和"答"声一样,计算机只认识 0 和 1。人类的文字多种多样,如何把人类的文字转换成计算机认识的 01 字符呢?这个过程需要通过字符编码。
字符编码(Character encoding)是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与另一套东西(如号码或电脉冲)进行配对。
和摩尔斯电码功能类似,上个世纪 60 年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系做了统一规定,这被称为 ASCII 码,一直沿用至今。
由于 ASCII 只有 128 个字符,虽然可以表示英文字符,但世界上还有很多其他文字无法表示,所以需要一种更加全面的字符编码。
于是又出现了Unicode 字符集(常见的 Unicode Transformation Format 有:UTF-8、UTF-16 以及 UTF-32 等),除此之外还有一些常用的中文编码:GBK、GB2312、GB18030等。
扩展知识
Unicode 和 UTF-8 有什么关系?
Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分文字系统进行了整理、编码,使得计算机可以用更为简单的方式来呈现和处理文字。
Unicode 备受认可,并广泛地应用于计算机软件的国际化与本地化过程。很多新技术,如可扩展置标语言(XML)、Java 编程语言以及现代的操作系统,都采用 Unicode 编码。
Unicode 是一套通用的字符集,包含世界上的大部分文字,也就是说,Unicode 是可以表示中文的。
但是,Unicode 虽然统一了全世界字符的编码,但没有规定如何存储。
如果 Unicode 统一规定每个符号用三个或四个字节表示,那么每个英文字母前必然有多个字节是 0(英文字母在 ASCII 中已有一个字节的表示)。这样文本文件的大小会因此大出两三倍,对于存储来说是极大的浪费。
为了解决存储效率问题,就出现了一些中间格式的字符集,它们被称为通用转换格式,即 UTF(Unicode Transformation Format)。常见的 UTF 格式有:UTF-8、UTF-16 以及 UTF-32。
- UTF-8 使用一至四个字节为每个字符编码
- UTF-16 使用二或四个字节为每个字符编码
- UTF-32 使用四个字节为每个字符编码
所以我们可以说,UTF-8、UTF-16 等都是 Unicode 的一种实现方式。
有了 UTF-8,为什么还要有 GBK?
UTF-8 是 Unicode 的一种实现,包含了世界上的所有文字,采用 1~4 字节变长编码。
对于那些优先纳入的文字,可以使用 1 字节或 2 字节存储;对于后来纳入的文字,则需要 3 字节或 4 字节存储。
正是由于 UTF-8 太全面了,那些纳入较晚的字符在 UTF-8 中占用的字节数可能更多,存储空间要求更大。
对于常用的汉字,在 UTF-8 中采用 3 字节编码,而如果有一种只包含中文和 ASCII 的编码,就只需要 2 个字节。
大多数网站只服务一个国家或地区。例如一个中国网站,通常只出现简体字、繁体字以及一些英文字符,很少出现日文或韩文。
出于这样的考虑,中国国家标准总局于 1981 年制定并实施了 GB 2312-80 编码,即中华人民共和国国家标准简体中文字符集。后来微软利用 GB 2312-80 未使用的编码空间,收录 GB 13000.1-93 全部字符,制定了 GBK 编码。
注:从时间线来看,GB 2312(1981 年)早于 UTF-8(1993 年)出现,因此 GB 系列编码最初并非为替代 UTF-8 而诞生,而是独立发展的国家标准。这里的问题"有了 UTF-8 为什么还要 GBK"更适合理解为:既然 Unicode 体系已经覆盖全球文字,为什么在实际系统中仍存在 GBK 编码——主要原因在于 GBK 对中文的存储效率更高,且存量系统兼容性有历史惯性。
有了标准中文字符集,纯中文网站可以采用这种编码方式,从而节省存储空间。
常用的中文编码有 GBK、GB2312、GB18030 等,最常用的是 GBK。
- GB2312(1980/1981 年):16 位字符集,收录 6763 个简体汉字、682 个符号,共 7445 个字符。
- 优点:适用于简体中文环境,属于中国国家标准,通行于大陆、新加坡等地。
- 缺点:不兼容繁体中文,汉字集合过少。
- GBK(1995 年):16 位字符集,收录 21003 个汉字、883 个符号,共 21886 个字符。
- 优点:适用于简繁中文共存的环境,为简体 Windows 所使用,向下完全兼容 GB2312,向上支持 ISO-10646 国际标准;所有字符可一对一映射到 Unicode 2.0。
- 缺点:不属于国家标准(而是 Microsoft 对 GB2312 的扩展),与 Big5 之间需要转换;很多搜索引擎不能很好地支持 GBK 汉字。
- GB18030(2000 年):32 位字符集,收录 27484 个汉字,同时收录藏文、蒙文、维吾尔文等主要少数民族文字。
- 优点:可收录几乎所有文字和符号,是中国最新的国家标准。
- 缺点:目前支持它的软件较少。
为什么会出现乱码?
文件中的内容归根到底都是由 0101 组成的,至于 0101 的二进制码如何转成人们可以理解的字符串,则需要通过规定好的字符编码标准进行转换。
如果把一串中文字符通过 UTF-8 编码传输给别人,别人拿到之后通过 GBK 进行解码,得到的内容就会是"锟斤拷锟斤拷…"之类的乱码。