Python3使用来自字节的UTF-8数据

时间:2018-09-07 20:38:28

标签: python python-3.x encoding utf-8 data-conversion

我正在使用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数据。

0 个答案:

没有答案