Python:特殊字符导致问题(来自PDFminer)

12 投票
1 回答
10386 浏览
提问于 2025-04-16 22:29

我用PDFminer里的pdf2text工具把一个PDF文件转换成了文本。可是,结果里面有一些特殊字符。让我给你看看我控制台的输出

>>>a=pdf_to_text("ap.pdf")

这是一个样本,稍微截断了一下

>>>a[5000:5500]
'f one architect. Decades ...... but to re\xef\xac\x82ect\none set of design ideas, than to have one that contains many\ngood but independent and uncoordinated ideas.\n1 Joshua Bloch, \xe2\x80\x9cHow to Design a Good API and Why It Matters\xe2\x80\x9d, G......=-3733'

我明白我需要对它进行编码

>>>a[5000:5500].encode('utf-8')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 237: ordinal not in range(128)

我搜索了一下,尝试了一些方法,特别是这个 在Python中替换特殊字符 的帖子。输入是来自PDFminer的,所以控制起来有点难(据我所知)。那么,有什么办法可以从这个输出中得到合适的纯文本呢?

我哪里做错了?

--一个快速解决办法:把PDFminer的编码改成ascii,但这不是长久之计--

--放弃了快速解决办法,寻找答案- 改变编码会丢失信息--

--这是一个相关的话题,正如Maxim提到的 http://en.wikipedia.org/wiki/Windows-1251 --

1 个回答

12

这个问题通常发生在存储了非ASCII文本的str对象中。你想做的事情是把一个已经用某种编码(因为它包含了编码值大于0x7f的字符)编码过的字符串再编码成utf-8

要把这样的字符串编码成utf-8,首先需要对它进行解码。假设原始文本的编码是cp1251(你可以用实际的编码替换它),可以用下面的方式来实现:

u = s.decode('cp1251')  # decode from cp1251 byte (str) string to unicode string
s = u.encode('utf-8')   # re-encode unicode string to  utf-8 byte (str) string

基本上,上面的代码片段做的事情和iconv --from-code=CP1251 --to-code=UTF-8命令是一样的,也就是把字符串从一种编码转换成另一种编码。

一些有用的链接:

撰写回答