在Python中读取PDF文件时,使用编解码器出现Unicode错误

3

我正在尝试阅读一个包含以下内容的pdf文件:

%PDF-1.4\n%âãÏÓ

如果我使用open读取它,它可以正常工作,但如果我尝试使用codecs.open(filename, encoding="utf8", mode="rb")获取一个Unicode字符串,我会收到以下异常:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 10: invalid continuation byte

你知道如何从这个文件的内容中获取一个unicode字符串吗?

PS:我正在使用Python 2.7

2个回答

8

PDF文件由二进制数据组成,而不是文本。它们无法被有意义地表示为Unicode字符串。

值得一提的是,您可以将PDF文件视为ISO8859-1文本处理,从而获得包含这些特定字符的Unicode字符串:

f = codecs.open(filename, encoding="ISO8859-1", mode="rb")

但是在这种情况下,最好还是使用普通的open读取字节。Unicode 用于文本,而非数据。


1
我不理解的是,为什么你可以使用open(即作为ASCII字符串)打开它,但不能作为Unicode字符串打开,而你仍然可以将u"\xe2"作为有效字符串。 - trez
您试图将文件读取为UTF-8字符串。只有特定的字节序列是有效的UTF-8数据;PDF头部中的那个不是有效的。 - user149341
@trez 在字符串 '\xe2' 和 Unicode 字符串 u"\xe2" 中,\xe2 的含义不同。在前者中,它是一个字面上的字节;而在后者中,它是 Unicode 码点。巧合的是,对于字符 â,Latin-1 表示是字节 \xe2,Unicode 码点是 U+00E2。这只是(实际目的上)一种巧合。 - Cairnarvon

1
撇开试图将任意二进制数据解释为文本的问题不谈,0xe2在Latin-1中表示的是â,而不是UTF-8。您正在使用错误的编解码器。

不是真的,我的编辑器认为它是Latin1并将其显示为â,但实际上这只是值0xe2。 - trez
编辑器根据通常找到的文本文件内容进行最佳猜测。PDF不是一个文本文件,因此,你编辑器的猜测是没有意义的。 - mkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接