将具有十六进制字符的bytes对象转换为字符串?

时间:2018-06-06 19:46:51

标签: python encoding decode

我遇到的麻烦比我想承认的要多。我已经检查了很多帖子,但没有运气。我正在尝试转换像这样的字节对象:

b = b'%PDF-1.5\r%\xe2\xe3\xcf\xd3\r\n'

成一个字符串变量。

我已经尝试了以下内容,

import codecs
codecs.decode(b, 'hex')
# Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

b.decode('hex')
# LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs


b.unhexlify(_)
#AttributeError: 'bytes' object has no attribute 'unhexlify'


str(b)
# just gives me the same bytes object with str type


b.decode('utf-8')
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte

谁能告诉我这里我做错了什么?

2 个答案:

答案 0 :(得分:1)

你有什么PDF文件;虽然部分基于ASCII文本,但PDF文件不是纯文本。你可以找到一种方法来解码标题中的魔术字节(iso8859-1应该这样做),但是一旦你点击一个deflate压缩的流,你就会有完整的熵256字节序列,这不是任何编解码器都有意义地解码。

IOW:没有办法将PDF文件的整个字节内容有意义地解码为Unicode字符串,因为它不是任何类型的Unicode代码点的直接表示。这就像尝试将JPEG文件解码为Unicode字符串一样:没有意义它是不可能的。

如果你想从PDF文件中提取文本,你必须实际解析和解码它的结构,这根本不是微不足道的。

答案 1 :(得分:0)

实际上b已经是一个字符串。您可以通过类型检查并验证它是否打印出所有特殊字符来了解它:

>>> b = b'%PDF-1.5\r%\xe2\xe3\xcf\xd3\r\n'
>>> type(b)
<type 'str'>
>>> print(b)
%ÔѤË1.5

>>>

如果你有真正的字节对象,你可以使用.decode(encoding)从字节转换为字符串。不好的是你需要知道你的编码才能做到这一点。

我使用此网站上的几个编码进行了反复试验:https://docs.python.org/2.4/lib/standard-encodings.html。它没有产生iso8859_15的错误,但我不能保证它是一个好的。这是一个片段:

line.decode('iso8859_15')
相关问题