我有一个包含以下内容的字节字符串:
my_var = b'\xc3\xbe\xc3\xbf\x004\x004\x000\x003\x006\x006\x000\x006\x00-\x001\x000\x000\x003\x008\x000\x006\x002\x002\x008\x005'
转换为utf-8时,我得到以下输出:
print(my_var.decode('utf-8'))
#> þÿ44036606-10038062285
前两个字符
表明是UTF-16BE的物料清单,
as indicated on Wikipedia
但是,我不明白的是,如果我像这样尝试UTF16 BOM:
if value.startswith(codecs.BOM_UTF16_BE)
codecs.BOM_UTF16_BE
不显示相同的结果:
print(codecs.BOM_UTF16_BE)
#> b'\xfe\xff'
为什么?
我怀疑在高端市场会遇到一些问题,但不知道如何解决这个问题。
已经有一些关于如何在Stackoverflow上解码UTF-16(比如
this one
),他们都说了一件事:使用
utf-16
Python将处理BOM。
print(my_var.decode('utf-16')
#> ë»ë¿ããããããããâ´ããããã ããããã ã
print(my_var.decode('utf-16be')
#> ì¾ì¿44036606-10038062285
(bom表未删除)
print(my_var.decode('utf-16le')
#> ë»ë¿ããããããããâ´ããããã ããããã ã
所以,因为我无法解释的原因,只使用
.decode('UTF-16')
不适合我。为什么?
更新
source = '\376\377\0004\0004\0000\0003\0006\0006\0000\0006\000-\0001\0000\0000\0003\0008\0000\0006\0002\0002\0008\0005'
我使用以下方法对其进行了转换:
def decode_8bit(cls, match):
value = match.group().replace(b'\\', b'')
return chr(int(value, base=8)).encode('utf-8')
my_var = re.sub(b'\\\\[0-9]{1,3}', decode_8bit, source)