我正在使用Python 3.7。
我有两个文件正在读取数据。两者都包含UTF-8数据(从技术上来说...)。一个被正确地“编码”为UTF-8,而另一个被编写为已解码的字节流。
# 'ba' is the on-disk form of the first (correctly-encoded) file
>>> ba = b'\xc3\xb6'
>>> ba
b'\xc3\xb6'
>>> ba.decode()
'ö'
# 'bb' is the on-disk form of the incorrectly-encoded second file
>>> bb = b'\xf6'
>>> bb
b'\xf6'
# 'bs' is the unicode version of the same byte value as bb
>>> bs = '\xf6'
>>> bs
'ö'
# If I try to decode ba, I get the correct value.
>>> ba.decode()
'ö'
>>> ba.decode() == bs
True
# But if I try to decode bb, I get an encoding error.
>>> bb.decode() == bs
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 0: invalid start byte
如何将bb
从错误编码的bytes
对象转换为正确解码的str
对象?我可以假设bb
是UTF-8解码数据blob而不是垃圾。
我已经进行了一些搜索以尝试自己解决问题。坦白地说,从Google搜索结果中过滤Python2.x数据段确实很困难。
我确实发现this answer很有帮助,因为它提到了"unicode-escape" encoding,它似乎可以满足我的要求:
>>> bb.decode('unicode-escape')
'ö'
>>> bb.decode('unicode-escape') == bs
True
但是,我不清楚在这种特定情况之外,“ unicode-escape”可能会出现哪些副作用。似乎表明它读取的是转义编码,但是我不相信b'\xf6'
是转义的:我相信它是一个单字节,表示为python解释器的十六进制。我假设转义的编码类似于b'\\xf6'
,应为四个字节:ASCII反斜杠,ASCII'x',ASCII'f'和ASCII'6'。
>>> bc
b'\\xf6'
>>> bc.decode()
'\\xf6'
>>> bc == bb
False
>>> bc.decode('unicode-escape')
'ö'
要清楚,我不希望这样的转义得到处理!我希望bc
的UTF版本等于'\\xf6'
为4的len
。
编辑1: 用户似乎认为这是duplicate question。我读了另一个问题,看不到这是重复的。另一个问题是关于latin-1。我不相信我正在处理latin-1数据。