字符集与编码的前世今生

翻译至: Character encodings: Essential concepts

本文将介绍字符与字符编码的一些基本概念。

Unicode字符集

Unicode是一个通用且标准的字符集,包括了大多数生活所需字符。可以理解为一本很厚的字典,记录着世界上所有字符对应的一个数字。

网络或者电脑上的文本均由字符组成,它们可以是字母表,标点符或者其他符号。过去,不同组织集成了不同的字符集并为它们创建了编码方案——可能覆盖西方的拉丁语,也可能覆盖远东的日语或者其他国家语言。

各种各样的编码方式成了系统开发者的噩梦,即便你熟练掌握各种编码方式,系统或单个页面却不支持集成的编码方案。在这样的历史背景下,一个支持多语言的编码方案就这样“顺民心,应天命”地出现了,一切都是那么的刚刚好。

Unicode联盟 提供了大型单一字符集,包括世界上书写系统所需的所有字符,包括古代文字(如楔形文字、哥特文字和埃及象形文字)。它现在是 WebOS 架构的基础,并受到所有主流Web浏览器和应用程序的支持。

接下来看看 Unicode脚本 支持的字符集,如下图。在这里插入图片描述

我们把 Unicode 前2个字节代表的65536个字符称为 基本多语言平面(BMP)BMP(Basic Multilingual Plane) 包含了更常用的字符。

Unicode 字符集大概包含大约一百万的字符(amazing),而BMP 后面的那些字符也被成为 补充字符(supplementary characters)
在这里插入图片描述

想了解关于 Unicode 更多的信息,可传送至 Unicode Home Page 或看这个教程 An Introduction to Writing Systems & Unicode

字符集,编码字符集与字符编码

清楚地区分字符集和字符编码的概念很重要。

字符集(Character sets)是由特定目的组成的字符集——字面理解,就是一堆字符组成的集合。

编码字符集(coded character sets)是指给每个字符都分配唯一编号。编码字符集中的字符编号被称为代码点(code points)。代码点的值表示字符在编码字符集中的位置,例如,Unicode编码字符集中字母 a 的代码点是十进制的 255 或者十六进制的 0xE1

字符编码(character encodings)代表编码字符集的代码点映射至字节的过程(以便计算机操作)。下图显示了 Tifinagh编码字符集 如何使用 UTF-8 编码,将代码点映射到字节编码。箭头显示它们如何映射到字节序列,其中每个字节由两位十六进制数表示。
在这里插入图片描述

Tips: 不用担心,UTF-8 用一个字节编码如上感叹号是有原因的,后面会提到。

One character set, multiple encodings. 对于同样的字符集,是可以有不同编码方案的。许多字符编码标准,如 ISO-8859 系列编码方案要求,代码点到编码的字节必须是一一映射。例如 ISO8859-1 编码位于数据集 65 位的字符 A,就是用二进制字节表示 65

然而对于其他编码方案并没有那么简单。例如在 Unicode编码字符集 中,a 的代码点是十进制的255。但在 UTF-8字符编码 中,它用两个字节来表示。换句话说,编码字符集和该字符的编码值之间并不是简单的一一映射。

例如:Unicode编码字符集 中的 a 可以在一种字符编码中用两个字节表示,在另一种字符编码中用四个字节表示,如下图。
在这里插入图片描述

UTF-8 使用 1 个字节来表示 ASCII集 中的字符,2 个字节表示多个字母块中的字符,3 个字节表示 BMP 的其余部分。**补充字符(supplementary characters)**使用 4 个字节。

UTF-16BMP 中的任何字符使用 2 个字节,对 补充字符 使用 4 个字节。

UTF-32 对所有字符使用 4 个字节。

在下图中,第一行表示字符在 Unicode 编码字符集 中代码点的值。其他行表示特定字符编码获得的字节值。
在这里插入图片描述

Unicode 编码总结

Unicode 没有规定字符对应的二进制码如何存储。以汉字 为例,它的 Unicode 代码点是 0x6c49,对应的二进制数是 110110001001001,二进制数有 15 位,这也就说明了它至少需要 2 个字节来表示。可以想象,在 Unicode 字典中往后的字符可能就需要 3 个字节或者 4 个字节,甚至更多字节来表示了。

这就导致了一些问题,计算机怎么知道你这个 2 个字节表示的是一个字符,而不是分别表示两个字符呢?这里我们可能会想到,那就取个最大的,假如 Unicode 中最大的字符用 4 字节就可以表示了,那么我们就将所有的字符都用 4 个字节来表示,不够的就往前面补 0。这样确实可以解决编码问题,但是却造成了空间的极大浪费,如果是一个英文文档,那文件大小就大出了 3 倍,这显然是无法接受的。

于是,为了较好的解决 Unicode 的编码问题, UTF-8UTF-16 两种当前比较流行的编码方式诞生了。当然还有一个 UTF-32 的编码方式,也就是上述那种定长编码,字符统一使用 4 个字节,虽然看似方便,但是却不如另外两种编码方式使用广泛。

Unicode 编码总结,摘要于 彻底弄懂 Unicode 编码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值