为什么UTF-8编码不需要字节顺序标记?

5

Unicode FAQ提到UTF-8不需要BOM。

问:无论底层处理器是小端还是大端,UTF-8编码方案是否相同?

答:是的。由于UTF-8被解释为字节序列,与使用16位或32位代码单元的编码形式相比,它没有字节顺序问题。在使用UTF-8时,只有当BOM被用作编码标记以将UTF-8与其他编码区分开来时,才会出现。它与字节顺序无关。

对于超过U+0744的码位,UTF-8需要2到4个字节才能表示。这些字节的字节序是需要BOM指定的吗?还是UTF-8采用默认方式?

2个回答

6
UTF-8 提供了对编码字符的字节顺序的严格定义,不允许在计算平台之间进行任何变化。
例如,欧元符号 U+20AC 必须被编码为字节序列 \xE2\x82\xAC,不允许使用其他字节序列。

4
UTF-8使用1字节的编码单元,因此不需要BOM来指示字节顺序,因为只有一种字节顺序可能存在,并且编码算法决定字节的排序。例如,U+0744在UTF-8中被编码为代码单元0xDD 0x84,这些代码单元以字节表示为DD 84。字节84 DD将是一个非法的UTF-8序列。
与UTF-16和UTF-32使用2字节和4字节代码单元不同,编码算法确定代码单元的顺序,但由于代码单元本身是多字节的,因此它们受到大小端的影响。例如,U+0744在UTF-16中被编码为代码单元0x0744,在UTF-32中被编码为代码单元0x00000744,在UTF-16中表示为07 4444 07,在UTF-32中表示为07 44 00 0000 00 44 07,具体取决于大小端。

因此,BOM用于指示实际使用的UTF-16/32大小端,但不用于UTF-8。


1
这一切都是有道理的,但请注意,《Unicode标准版本5.0》指出UTF-8可以使用BOM。请参见第2.6节编码方案中的表2.4,以及随后的段落,了解可能使用BOM的特殊情况的说明。 - skomisa
2
@skomisa 是的,在UTF-8中使用BOM是允许的,但基于兼容性原因,它通常在大多数情况下是不鼓励使用的。而且它肯定不是用于字节序目的(这个问题的重点),只是用于识别目的,以将其与其他UTF区分开来。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接