Unicode 为什么BOM是U+;FE FF,而不是U+;FF FE?
所以我在自学字符编码,我有一个大概很愚蠢的问题:他说 字节顺序标记(BOM)是一个Unicode字符,U+FEFF字节顺序 标记(BOM) ,页面上的图表会写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,那么为什么对于
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
)。是的,正如你可能猜到的,有一个模棱两可的赌注