UNICODE 为一个字符使用 2 个字节,因此它有大或小的字节序差异。例如,字符哈是54 C8
十六进制的。因此,它的 UTF-8 是:
11100101 10010011 10001000
UTF-8 使用 3 个字节来表示相同的字符,但它没有大端或小端。为什么?
UNICODE 为一个字符使用 2 个字节,因此它有大或小的字节序差异。例如,字符哈是54 C8
十六进制的。因此,它的 UTF-8 是:
11100101 10010011 10001000
UTF-8 使用 3 个字节来表示相同的字符,但它没有大端或小端。为什么?
注意:由于历史原因,Windows 对 UCS-2 使用术语“Unicode”——最初这是将 Unicode 代码点编码为字节的唯一方法,因此区别并不重要。但在现代术语中,这两个示例都是 Unicode,但第一个具体是 UCS-2 或 UTF-16,第二个是 UTF-8。
UCS-2 有 big-endian 和 little-endian,因为它直接将代码点表示为 16 位“uint16_t”或“short int”数字,就像在 C 和其他编程语言中一样。它与其说是一种“编码”,不如说是数值的直接内存表示,因为 uint16_t 在不同的机器上可以是 BE 或 LE,UCS-2 也是如此。后来的 UTF-16 只是为了兼容性继承了同样的烂摊子。
(它可能是为特定的字节顺序定义的,但我猜他们觉得它超出了范围,或者不得不在代表不同硬件制造商的人之间妥协。我不知道实际的历史。)
同时,UTF-8 是一种可变长度编码,它可以使用 1 到 6 个字节来表示一个 31 位的值。字节表示与 CPU 架构完全没有关系;相反,有一种特定的算法可以将数字编码为字节,反之亦然。无论在哪个 CPU 上运行,该算法始终以相同的顺序输出或消耗位。
char[]
与字节数组(在 C 或byte[]
许多其他语言中)没有任何关联的字节序但其他类型的数组比这样做更大的原因完全相同byte
。这是因为字节序是您将由多个字节表示的值存储到内存中的方式。如果您只有一个字节,那么您只有一种方法将其存储到内存中。但是,如果 anint
由索引 1 到 4 的 4 个字节组成,那么您可以按许多不同的顺序存储它,例如 [1, 2, 3, 4], [4, 3, 2, 1], [2, 1, 4, 3], [3, 1, 2, 4]...分别是小端、大端、混合端...Unicode 有许多不同的编码,称为Unicode 转换格式,主要是 UTF-8、UTF-16 和 UTF-32。UTF-16 和 UTF-32分别以 16 位和 32 位为单位工作,显然,当您将 2 或 4 个字节存储到字节寻址内存中时,您必须定义要读取/写入的字节顺序。UTF-8 OTOH 在一个字节单元上工作,因此它没有字节序
原因(或可能的解释)是这三个字节编码的代码点位与 UTF-16 不同:
代码点(
01010100 11001000
[哈54 C8
])的 16 位分布在 UTF-8 字节流中的三个字节(第一个字节和两个连续字节)中。根据编码规则,最高有效位始终是最左边的一位。这允许从最低到最高字节索引逐字节解析 UTF-8。
比较:UTF-8(D92 UTF-8 编码形式 - 3.9 Unicode 编码形式,Unicode 14.0.0 p. 123)
代码点的数量如何存储在计算机内存中则不受此影响。
使用 UTF-16 并不那么清楚,因为 UTF-16 可能会建议逐字读取字节流(而不是逐字节)。从此以后,一个字中字节顺序的含义(以及位的顺序)可能会有所不同:
如果您现在要将流中的单词映射到计算机内存中,则需要为体系结构进行匹配以获取代码点值。
另见:Big Endian 和 Little Endian 字节顺序之间的区别
这是官方的主要来源材料(2020 年 3 月发布):
“Unicode® 标准,版本 13.0”
第 2 章:一般结构(文档第 39 页;PDF 第 32 页)
另请参阅以下相关信息:
原因很简单。UTF-16 和 UTF-32 有大端和小端版本,因为有些计算机具有位和小端寄存器。如果 Unicode 文件的字节序与处理器的字节序匹配,则可以在单个操作中直接从内存中读取字符值。如果它们不匹配,则需要第二个转换步骤来翻转该值。
相反,在读取 UTF-8 时,处理器的字节顺序无关紧要。程序必须读取各个字节并执行一系列测试和位移,以将字符值存入寄存器。拥有一个字节顺序颠倒的版本将毫无意义。
根据一些 Windows 文档,编码映射到最多 4 个字节的流。也有人说处理器字节序无关紧要。所以我认为这对开发人员意味着你不应该担心在 Windows 上使用 utf-8 的字节序。这就是设计理念。因此,您现在应该关注您应该如何适当地使用 Windows 功能,以使其无关紧要。现在进来的流很重要,但是你应该不必处理 utf-8 的解码和编码。
但是,有可能深入了解这一点,完全理解,这可能会有所帮助。但基本上 Windows 说你不需要知道系统的字节序来处理 utf-8 以将流编码和解码为 utf-8。