首页 > 解决方案 > utf-16 编码字符串是否需要 [0xff, 0xfe] 前缀?

问题描述

改写问题!

我正在使用需要对字符串进行“unicode 编码”的供应商设备,其中每个字符都用两个字节表示。我的字符串将始终基于 ASCII,所以我认为这是将我的字符串转换为供应商字符串的方法:

>>> b1 = 'abc'.encode('utf-16')

但是检查结果,我看到字节数组上有一个前导 [0xff, 0xfe] :

>>> [hex(b) for b in b1]
['0xff', '0xfe', '0x61', '0x0', '0x62', '0x0', '0x63', '0x0']

由于供应商的设备不期望 [0xff, 0xfe],我可以将其删除...

>>> b2 = 'abc'.encode('utf-16')[2:]
>>> [hex(b) for b in b2]
['0x61', '0x0', '0x62', '0x0', '0x63', '0x0']

...这就是我想要的。

但真正让我感到惊讶的是,我可以解码 b1 和 b2 并且它们都重新组合为原始字符串:

>>> b1.decode('utf-16') == b2.decode('utf-16')
True

所以我的两个相互交织的问题:

标签: python-3.xutf-16

解决方案


这是字节顺序标记。它是 UTF 文档的前缀,指示文档使用的字节顺序。它通过按0xFEFF字节顺序对代码点进行编码来实现这一点——在这种情况下,是小端(首先是不重要的字节)。任何试图以相反方式读取它的东西,在大端(更重要的字节优先)中,将第一个字符读取为0xFFFE,这是一个特别不是有效字符的代码点,通知读者它需要错误或切换字节序对于文档的其余部分。


推荐阅读