为什么表示英文字符所需的字节数比其他字母要少?

为什么表示英文字符所需的字节数比其他字母要少?

当我在文本文件中输入“a”时,它会占用 2 个字节,但是当我输入“ա”(亚美尼亚字母表中的字母)时,它会占用 3 个字节。

计算机的字母表有什么区别?
为什么英语占用的空间较少?

答案1

第一个被开发用于主流计算机的编码方案是ASCII美国标准信息交换码)标准,是20世纪60年代在美国开发起来的。

英文字母表使用了拉丁字母表的一部分(例如,英语中很少有重音词)。该字母表中有 26 个字母(不考虑大小写)。而且,在任何假装对英文字母表进行编码的方案中,还必须存在单独的数字和标点符号。

20 世纪 60 年代的计算机还没有我们现在拥有的内存或磁盘空间那么多。ASCII 被开发为所有美国计算机中功能性字母的标准表示。当时,由于当时的技术细节,决定将每个 ASCII 字符的长度设为 8 位(1 字节)(维基百科文章提到,穿孔纸带每次在一个位置上可容纳 8 位)。事实上,原始 ASCII 方案可以使用 7 位进行传输,8 位可用于奇偶校验。后来的发展扩展了原始 ASCII 方案,包括几个重音、数学和终止字符。

随着近年来全球计算机使用量的增加,越来越多使用不同语言的人开始使用计算机。这意味着,对于每种语言,都必须开发新的编码方案,这些方案与其他方案无关,如果从不同语言的终端读取,这些方案就会发生冲突。

统一码通过将所有可能有意义的字符合并为一个抽象字符集,解决了不同终端的存在问题。

UTF-8是编码 Unicode 字符集的一种方式。它是一种可变宽度编码(例如,不同的字符可以具有不同的大小),并且设计用于向后兼容以前的 ASCII 方案。因此,ASCII 字符集将保持为一个字节大小,而任何其他字符则为两个或更多字节大小。UTF-16 是编码 Unicode 字符集的另一种方式。与 UTF-8 相比,字符被编码为一组 16 位或 2 个 16 位代码单元。

正如评论中所述,字符“a”占用一个字节,而“ա”占用两个字节,表示 UTF-8 编码。问题中的额外字节是由于末尾存在换行符(原作者发现了这一点)。

答案2

1 个字节是 8 位,因此可以表示最多 256 (2^8) 个不同的值。

对于需要更多可能性的语言,简单的一对一映射无法维持,因此需要更多的数据来存储字符。

请注意,通常大多数编码使用前 7 位(128 个值)表示ASCII字符。剩下第 8 位,或者说 128 个值用于保存更多字符……添加重音字符、亚洲语言、西里尔字母等,您就会很容易明白为什么 1 个字节不足以保存所有字符。

答案3

在 UTF-8 中,ASCII 字符使用一个字节,其他字符使用两个,三个或四个字节。

答案4

20 世纪 60 年代(以及之后很长一段时间)的字符代码都是特定于机器的。20 世纪 80 年代,我曾短暂使用过一台 DEC 2020 机器,它有 36 位字,以及 5、6 和 8(伊维萨克) 位/字符编码。在此之前,我使用的是带有 EBCDIC 的 IBM 370 系列。7 位 ASCII 带来了秩序,但它与 IBM PC“代码页”一起使用所有 8 位来表示额外字符(例如用于绘制原始菜单的各种方框绘图字符)以及后来的 ASCII 扩展(如 Latin-1(8 位编码,前 7 位与 ASCII 类似,另一半用于“国家字符”,如ñÇ、 或其他))变得一团糟。可能最受欢迎的是 Latin-1,它针对使用拉丁字符(以及重音符号和变体)的英语和大多数欧洲语言进行了定制。

编写混合文本(例如英语和西班牙语)很顺利(只需使用 Latin-1,两者的超集),但混合使用不同编码的任何内容(例如包括希腊语或俄语的片段,更不用说日语等亚洲语言)是一场真正的噩梦。最糟糕的是俄语,尤其是日语和中文有几种流行的、完全不兼容的编码。

今天我们使用的Unicode,又加上了像UTF-8这样有利于英文字符的高效编码(令人惊奇的是,英文字母的编码恰好对应ASCII),因此很多非英文字符要使用更长的编码。

相关内容