为什么有多个版本的 Unicode?为什么不是所有的东西都是 UTF-8?

  • 本文关键字:UTF-8 Unicode 版本 unicode utf-8
  • 更新时间 :
  • 英文 :


我一次又一次地问自己:为什么他们总是坚持把一切都复杂化?!

多年来,我多次尝试阅读和理解Unicode。当他们开始谈论字节序和 BOM 以及所有这些东西时,我的眼睛只是"分区"。我身体上无法继续阅读并记住我所看到的。我从根本上不明白他们想要把一切都复杂化的愿望。

为什么我们需要 UTF-16 和 UTF-32 以及"大端序"和"小端序"以及 BOM 以及所有这些废话?为什么Unicode不被定义为"与ASCII兼容,但你也可以使用多个字节来表示所有这些进一步的字符"?那本来会很好,很简单,但是没有...让我们拥有所有这些其他东西,以便Microsoft为 Windows NT 选择 UTF-16,没有什么是容易或直接的!

与往常一样,可能有一个原因,但我怀疑它是否足以证明所有这些混乱以及所有这些因坚持使其如此复杂和难以理解而引起的问题。

Unicode 最初是一个 16 位字符集,所以自然而然地每个字符都被简单地编码为两个连续的字节。然而,很快就发现这还不够,所以增加了限制。问题在于,一些编程语言和操作系统已经开始将Unicode实现为16位,他们不能扔掉他们已经构建的所有东西,因此设计了一种新的编码,与这些16位实现保持向后兼容,同时仍然允许完全的Unicode支持。这是 UTF-16。

UTF-32 将每个字符表示为四个字节的序列,这是完全不切实际的,几乎从未用于实际存储文本。但是,在实现对单个代码点进行操作的算法(例如 Unicode 标准本身定义的各种机制(时,它非常有用,因为所有代码点的长度始终相同,迭代它们变得微不足道,因此您有时会发现它在内部用于缓冲区等。

同时,UTF-8是您实际想要用于存储和传输文本的内容。它与ASCII和自同步兼容(与其他两个不同(,并且非常节省空间(与UTF-32不同(。它也永远不会在一行中生成八个二进制零(除非您尝试表示文字 NULL 字符(,因此 UTF-8 可以安全地用于字符串以 null 结尾的传统环境中。

字节序只是数据类型的固有属性,其中最小的有效单位大于一个字节。计算机并不总是同意以什么顺序读取字节序列。对于 Unicode,可以通过在文本流中包含字节顺序标记来避免此问题,因为如果您以 UTF-16 或 UTF-32 的错误方向读取其字节表示形式,它将产生一个没有理由出现的无效字符,因此您知道此特定顺序不可能是正确的顺序。

最新更新