关于UTF-16编码输出中\xff\xfe字节序列的技术疑问
UTF-16编码中
\xff\xfe的疑问解答 1. \xff\xfe是什么?
这是字节顺序标记(BOM, Byte Order Mark),专门用来标识UTF-16编码的字节排列顺序(大端/小端)。因为UTF-16每个字符占2字节,两个字节的先后顺序会直接影响解码结果:
- 大端序:高位字节在前,比如字符
b的UTF-16编码U+0062会存成\x00\x62 - 小端序:低位字节在前,同样的
b会存成\x62\x00(也就是你看到的b\x00)
\xff\xfe就是小端序的BOM标识,对应的大端序BOM是\xfe\xff。
2. 为什么是fe而非\x00?
BOM源自Unicode的特殊字符U+FEFF(零宽无间断空格),把这个字符用UTF-16小端序编码时:U+FEFF的16位二进制是11111110 11111111,按小端序(低位字节在前)拆分后,就变成了\xff(低位字节) + \xfe(高位字节),也就是\xff\xfe。
如果用\x00替代,这个序列会和普通字符的编码(比如U+0000)混淆,无法起到标记字节顺序的作用。而U+FEFF是一个非打印的特殊字符,用它的编码做BOM,既不会干扰正常文本内容,又能明确告诉解码器该用哪种字节顺序来解析。
回到你的代码示例:Python默认使用UTF-16小端序编码,所以先输出BOM\xff\xfe,再按小端序存储每个字符——b对应\x62\x00,a对应\x61\x00,最终得到结果b'\xff\xfeb\x00a\x00'。
内容的提问来源于stack exchange,提问作者user20144486
相关产品推荐
相关产品推荐

