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

kha*_*vah 31 unicode character-encoding special-characters

当我将“a”放入文本文件时,它会变成 2 个字节,但是当我放入“?”时,它是一个来自亚美尼亚字母表的字母,它会变成 3 个字节。

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

Dok*_*ard 41

最早开发用于主流计算机的编码方案之一是ASCII美国信息交换标准代码)标准。它是在 1960 年代在美国开发的。

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

1960 年代也是计算机没有我们现在拥有的内存或磁盘空间量的时期。ASCII 被开发为适用于所有美国计算机的功能字母表的标准表示。当时,将每个 ASCII 字符设为 8 位(1 个字节)长的决定是由于当时的技术细节(维基百科文章提到穿孔胶带一次在一个位置上保持 8 位的事实)。事实上,原始的 ASCII 方案可以使用 7 位传输,其中 8 位可以用于奇偶校验。后来的发展扩展了最初的 ASCII 方案,包括几个重音、数学和终端字符。

随着最近全世界计算机使用量的增加,越来越多不同语言的人可以使用计算机。这意味着,对于每种语言,必须独立于其他方案开发新的编码方案,如果从不同的语言终端读取,则会发生冲突。

Unicode通过将所有可能的有意义的字符合并为一个抽象字符集来解决不同终端的存在。

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

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

  • 没有以任何正常编码或文件格式对文件结尾进行编码的最后一个字节。当程序读取文件时,操作系统可能会以特殊方式发出文件结束信号,但这是一个不同的问题。 (26认同)
  • @DoktoroReichard:请在回答中澄清 Unicode _not_ 是一种编码;相反,它是一个抽象字符集,UTF-16 和 UTF-8 是 Unicode 代码点的编码。您答案的最后几段主要讨论 UTF-8。但是如果一个文件使用 UTF-16,那么任何代码点,甚至是 `a` 的代码点,都将使用两个字节(或两个的倍数)。 (7认同)
  • @khajvah 如果你`echo 'ա' > file.txt` 它,或者使用一些编辑器编辑文件,它们会自动在它后面添加一个换行符。如果你运行 `xxd file.txt`,最后一个字节可能是 `0a`,或者换行。 (6认同)
  • 可能还值得强调的是,“扩展 ASCII”字符集实际上根本不是 ASCII,并且利用第八位的不同方式的数量使它变得一团糟。只需使用 UTF-8 代替。 (6认同)
  • unicode UTF-8 版本中的 ա 字符为 2 个字节(0xD5A1);两个文件中都存在额外的字符(无论是什么)。http://www.marathon-studios.com/unicode/U0561/Armenian_Small_Letter_Ayb (2认同)
  • 正确的 ASCII 是 7 位,而不是 8 (2认同)

ern*_*nie 17

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

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

请注意,通常大多数编码使用前 7 位(128 个值)作为ASCII字符。这留下了第 8 位,或更多字符的 128 个值。. . 添加重音字符、亚洲语言、西里尔文等,您很容易明白为什么 1 个字节不足以保留所有字符。


Jas*_*son 10

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

  • 不是“在 Unicode”中,在 UTF8 中 - 这只是 Unicode 字符集的几种编码之一。 (15认同)