Unicode 为什么BOM是U+;FE FF,而不是U+;FF FE?

Unicode 为什么BOM是U+;FE FF,而不是U+;FF FE?,unicode,utf-8,character-encoding,Unicode,Utf 8,Character Encoding,所以我在自学字符编码,我有一个大概很愚蠢的问题:他说 字节顺序标记(BOM)是一个Unicode字符,U+FEFF字节顺序 标记(BOM) ,页面上的图表会写 Encoding Representation (hexadecimal) UTF-8 EF BB BF UTF-16 (BE) FE FF UTF-16 (LE) FF FE ... 我对此有点困惑。正如我所知,大多数使用英特尔CPU的机器都是little endian,那么为什么对于

所以我在自学字符编码,我有一个大概很愚蠢的问题:他说

字节顺序标记(BOM)是一个Unicode字符,U+FEFF字节顺序 标记(BOM)

,页面上的图表会写

Encoding      Representation (hexadecimal)  
UTF-8         EF BB BF  
UTF-16 (BE)   FE FF  
UTF-16 (LE)   FF FE  
...
我对此有点困惑。正如我所知,大多数使用英特尔CPU的机器都是little endian,那么为什么对于UTF-16(BE),BOM是
U+FE FF
,而对于UTF-8,BOM是
U+EF BB BF
,或者对于UTF-16(LE),BOM是
U+FF FE

为什么物料清单是UTF-16(BE)的U+FE FF

事实并非如此。BOM是字符编号U+FEFF。没有空格,是一个十六进制数,也就是65279。此定义不取决于在任何特定编码中用于表示该字符的字节序列

UTF-16LE中编码字符(*)的字节序列的十六进制表示法,
0xFE,0xFF
与字符编号的十六进制表示法具有相同的数字顺序
U+FEFF
;这只是一个大端的人工制品,它将最重要的内容放在左边,就像人类对大的[十六]十进制数字所做的一样

(*以及基本多语言平面中的任何字符。当超出此范围时,它会变得更复杂,因为它们不再适合两个字节。)

为什么物料清单是UTF-16(BE)的U+FE FF

事实并非如此。BOM是字符编号U+FEFF。没有空格,是一个十六进制数,也就是65279。此定义不取决于在任何特定编码中用于表示该字符的字节序列

UTF-16LE中编码字符(*)的字节序列的十六进制表示法,
0xFE,0xFF
与字符编号的十六进制表示法具有相同的数字顺序
U+FEFF
;这只是一个大端的人工制品,它将最重要的内容放在左边,就像人类对大的[十六]十进制数字所做的一样

(*以及基本多语言平面中的任何字符。当超出此范围时,它会变得更复杂,因为它们不再适合两个字节。)

据我所知,大多数使用英特尔CPU的机器都是little endian

Intel CPU不是世界上使用的唯一CPU。AMD、ARM等,还有大端CPU

为什么物料清单是UTF-16(BE)的U+FE FF,而不是UTF-8的U+EF BB BF或UTF-16(LE)的U+FF FE

U+FEFF
是Unicode码点名称
FE FF
EF BB BF
FF FE
,这些是字节序列
U+
仅适用于Unicode码点指定,而不适用于字节

Unicode码点
U+FEFF零宽度不间断空格
(这是它的官方名称,不是
U+FEFF字节顺序标记
,但也用作BOM)的数值是
0xFEFF
(65279)

UTF-8中编码的代码点值产生三个8位代码单元值
0xEF 0xBB 0xBF
,它们不受任何endian问题的影响,这就是UTF-8没有单独的LE和BE变体的原因

UTF-16中编码的相同代码点值产生一个16位代码单位值
0xFEFF
。因为它是一个多字节(16位)值,所以当解释为两个8位字节时,它受endian约束,因此是LE(
0xFF 0xFE
)和BE(
0xFE 0xFF
)变体

受影响的不仅仅是BOM。UTF-16字符串中的所有代码单元都受endian的影响。BOM帮助解码器知道整个字符串中用于代码单元的endian

UTF-32也使用多字节(32位)代码单元,也受endian的约束,因此它也有LE和BE变体,以及一个32位BOM表,用于向解码器表示endian(LE为
0xFF 0xFE 0x00 0x00
,BE为
0x00 0xFE 0xFF
)。是的,正如您可能猜到的,如果您不提前知道要处理的是哪个UTF,那么UTF-16LE BOM和UTF-32LE BOM之间是不明确的。BOM用于标识尾端,因此名称为“字节顺序标记”,而不是特定编码(尽管通常用于此目的)

据我所知,大多数使用英特尔CPU的机器都是little endian

Intel CPU不是世界上使用的唯一CPU。AMD、ARM等,还有大端CPU

为什么物料清单是UTF-16(BE)的U+FE FF,而不是UTF-8的U+EF BB BF或UTF-16(LE)的U+FF FE

U+FEFF
是Unicode码点名称
FE FF
EF BB BF
FF FE
,这些是字节序列
U+
仅适用于Unicode码点指定,而不适用于字节

Unicode码点
U+FEFF零宽度不间断空格
(这是它的官方名称,不是
U+FEFF字节顺序标记
,但也用作BOM)的数值是
0xFEFF
(65279)

UTF-8中编码的代码点值产生三个8位代码单元值
0xEF 0xBB 0xBF
,它们不受任何endian问题的影响,这就是UTF-8没有单独的LE和BE变体的原因

UTF-16中编码的相同代码点值产生一个16位代码单位值
0xFEFF
。因为它是一个多字节(16位)值,所以当解释为两个8位字节时,它受endian约束,因此是LE(
0xFF 0xFE
)和BE(
0xFE 0xFF
)变体

受影响的不仅仅是BOM。UTF-16字符串中的所有代码单元都受endian的影响。BOM帮助解码器知道整个字符串中用于代码单元的endian

UTF-32也使用多字节(32位)代码单元,也受endian的约束,因此它也有LE和BE变体,以及一个32位BOM表,用于向解码器表示endian(LE为
0xFF 0xFE 0x00 0x00
,BE为
0x00 0xFE 0xFF
)。是的,正如你可能猜到的,有一个模棱两可的赌注