繁体   English   中英

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

[英]Convert a bytes object with hexadecimal characters to string?

我遇到的麻烦比我想承认的要多。 我已经检查了无数运气。 我正在尝试像这样转换一个字节对象:

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

谁能告诉我我在做什么错?

您所拥有的是PDF文件; 虽然部分基于ASCII文本,但PDF文件不是纯文本。 您甚至可以找到一种方法来解码标头中的魔术字节(iso8859-1应该这样做),但是一旦您遇到压缩压缩的流,您将拥有全熵256字节的序列,这些序列无法进行有意义的解码与任何编解码器。

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

如果要从PDF文件中提取文本,则必须实际解析和解码其结构,这一点都不琐碎。

实际上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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM