Python:特殊字符导致问题(来自PDFminer)
我用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
命令是一样的,也就是把字符串从一种编码转换成另一种编码。
一些有用的链接: