【发布时间】:2010-09-30 18:33:49
【问题描述】:
UTF-8 可以包含 BOM。然而,它 没有区别 字节流的字节序。 UTF-8 始终具有相同的字节顺序。
如果Utf-8 将所有代码点存储在一个字节中,那么为什么字节序不发挥任何作用以及为什么不需要BOM 是有道理的。但是由于代码点 128 及以上使用 2、3 和最多 6 个字节存储,这意味着它们在大端机器上的字节顺序与在小端机器上不同,所以我们怎么能声称 Utf-8 总是具有相同的字节顺序?
谢谢
编辑:
UTF-8 是面向字节的
我知道如果两个字节 UTF-8 字符 C 由字节 B1 和 B2 组成(其中 B1 是第一个字节,B2 是最后一个字节),那么UTF-8 这两个字节是总是以相同的顺序写入(因此,如果这个字符被写入小端机器LEM 上的文件,B1 将是第一个,B2 最后一个。类似地,如果C 被写入大端机器上的文件机器BEM、B1 仍将是第一个,B2 仍将是最后一个)。
但是当C 被写入LEM 上的文件F 时会发生什么,但是我们将F 复制到BEM 并尝试在那里读取它?由于BEM 自动交换字节(B1 现在是最后一个字节,B2 第一个字节),读取F 的应用程序(在BEM 上运行)如何知道F 是否是在BEM 上创建的,因此是两个的顺序字节没有被交换或者F 是否从LEM 转移,在这种情况下BEM 自动交换了字节?
我希望这个问题有意义
编辑 2:
响应您的编辑:big-endian 如果你问,机器不会交换字节 他们一次读取一个字节。
a) 哦,所以即使字符 C 是 2 个字节长,读取 F 的应用程序(驻留在 BEM 上)也会读入内存一次只有一个字节(因此它将首先读入内存B1,然后才读入B2)
b)
在 UTF-8 中,您决定如何处理 字节基于其高位
假设文件F有两个后续字符C和C1(其中C由字节组成B1 和 B2 而 C1 有字节 B3、B4 和 B5 )。阅读 F 的应用程序如何仅通过检查每个字节的高位来知道哪些字节属于一起(例如,它如何确定 B1 和 B2 合起来应该代表一个字符而不是 B1,*B2* 和 B3)?
如果你相信你看到 不同的东西,请编辑你的 问题并包括
我不是这么说的。我只是不明白发生了什么
c) 为什么 Utf-16 和 Utf-32 也不是面向字节的?
【问题讨论】:
-
“面向字节”意味着您一次读取一个字节,并根据该字节决定要做什么。在 UTF-8 中,您根据字节的高位来决定如何处理它。相比之下,在 UTF-16 和 UTF-32 中,您一次处理多个字节,并且必须将它们组织成单词。
-
响应您的编辑:如果您要求大端机器一次读取一个字节,则它们不会交换字节。如果您认为您看到了不同的东西,请编辑您的问题并包括 (1) 源和目标计算机和操作系统,(2) 您复制文件(从您的终端复制粘贴,不要解释),以及 (3) 证明文件已更改(例如,通过使用
od显示字节级输出)。哦,请使用code以外的一些亮点。 -
来自 UTF-8 FAQ (unicode.org/faq/utf_bom.html): 问:UTF-8 的定义是什么?答:UTF-8 是 Unicode 的面向字节的编码形式。 (后面有更多详细信息的链接)。
-
@mlvljr 你的意思是……?
-
UTF-8 不是由字节序参数化的,但多字节序列必须具有某种排序约定的直觉是一个很好的直觉。 UTF-8 多字节序列中直接包含了一种大字节序。如果将 UTF-8 字节序列的所有有效位从左到右粘贴在一起并用前导零填充,则会得到代码点的大端表示(如果填充为 32 位,则为 UTF-32)。假设可以使用小端序,但它会非常尴尬。