UTF-8 是否有 UCS 同义词,例如 UTF-16 是 UCS-2,UTF-32 是 UCS-4?



在浏览 unicode 文档时,我有时会看到术语 UTF-16 与 UCS-2 互换使用,而 UTF-32 和 UCS-4 也是如此。我想知道 UTF-8 是否也有一个很酷的昵称,比如 UCS-1 或其他什么......

No.它们也不完全相同。

UCS-2 是 ISO 10646(如今几乎是 Unicode 的标准,但没有一些关于如何处理字符的规则)和 Unicode 版本 1 的过时编码,每个字符 2 个八位字节(8 位字节)。在 1996 年之前,它允许它对所有通用字符集(因此UCS)进行编码,但它不适用于所有 Unicode 版本 2 或更高版本(我们目前使用的是版本 10)。

UTF-16 使用 2 个八位字节组对字符或代理项对(因此总共 4 个八位字节)进行编码,以编码 U+10000 及更高。它向后兼容 UCS-2,因此任何可以处理 UTF-16 的东西都会将 UCS-2 理解为有效的 UTF-16,但期望 UCS-2 的旧软件会将代理项视为普通字符(它不会理解,因为相关的代码点没有分配给 Unicode 版本 1 中的任何内容)。

UCS-4 最初由 ISO 10646 定义为 32 位编码,每个字符使用 4 个八位字节,理论上能够支持高达 U+7FFFFFF 的代码点(最高位永远不会设置为 1,以避免混淆对无符号 32 位值的支持不是很好)。ISO 此后声明,ISO 10646 永远不会以不同于 Unicode 的方式分配代码点,因此永远不会超过 U+10FFFF。

Unicode 联盟对 UTF-32 的定义方式与 UCS-4 大致相同,只是它从一开始就具有 U+10FFFF 的声明限制。因此,虽然两者曾经在理论(但未使用)限制上有所不同,但它们现在是一样的。但是因为它们曾经是不同的,所以说它们是相同事物的不同名称并不完全正确。(他们更像是同卵双胞胎,而不是有两个名字的人)。

UTF-8 每个字符使用 1、2、3 或 4 个八位字节,具体取决于码位。它是在ISO 10646和Unicode在最大可能码位上有所不同时开发的,并且旨在与其中任何一个一起使用,同时保持与ASCII/ISO 646的8位编码向后兼容。因此,它最初也可以有 5 或 6 个八位字节来支持 ISO 10646 支持的 U+110000 到 U+7FFFFFF 范围,但 Unicode 不支持。由于 U+10FFFF 现在是两者的最大值,因此它不再允许这 5 个和 6 个八位字节组合。

在 UTF-8 是 UTF-8 之前,它是 X/Open 的 FSS-UTF("文件系统安全 UCS 转换格式"),所以如果你认为 FSS-UTF "很酷",这是一个"很酷的昵称"。

还值得注意的是,"UTF-16"和"UTF-32"可以表示编码形式(表示应用程序内部文本的方式)或编码方案(在应用程序或计算机之间传输文本的方式)。在前一种情况下,字节顺序是未指定的(由硬件或编译器决定),而在后一种情况下,字节顺序确实很重要。编码方案要求使用前导文件签名来指定字节顺序,而编码形式禁止使用这样的字节顺序标记(任何此类字节序列都必须被视为"有效载荷"的一部分)。

类似的考虑也适用于"UTF-8",即使字节顺序在那里无关紧要;在这种情况下的区别在于,编码方案还允许(但不强制要求)前导签名(它"碰巧"匹配对应于 UTF-16 和 UTF-32 字节顺序签名的代码点的 UTF-8编码)。编码形式明确禁止这样的签名,任何这样的序列都必须被视为"有效载荷"的一部分。

UTF-16 和 UTF-32 编码方案由 UTF-16LE、UTF-16BE、UTF-32LE 和 UTF-32BE 补充,这些编码方案明确禁止前导字节顺序标记,而是要求通过其他方式协商字节顺序。

最新更新