Python: специальные символы, дающие мне проблемы (из PDFminer)
Я использовал pdf2text из PDFminer для уменьшения PDF-текста. К сожалению, он содержит специальные символы. Позвольте мне показать вывод с моей консоли
>>>a=pdf_to_text("ap.pdf")
heres образец, немного усеченный
>>>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, поэтому его жесткий (AFAIK), чтобы контролировать это. Каким образом можно сделать правильный открытый текст из этого вывода?
Что я делаю неправильно?
- Быстрое исправление: измените кодек PDFminer на ascii- но это не долговременное решение -
- Заблокировано быстрое исправление ответа - изменение кодека удаляет информацию -
- Относительная тема, упомянутая Максимом http://en.wikipedia.org/wiki/Windows-1251 -
Ответы
Ответ 1
Эта проблема часто возникает, когда текст не-ASCII хранится в объектах str
. То, что вы пытаетесь сделать, - это закодировать в utf-8
строку, уже закодированную в некоторой кодировке (потому что она содержит символы с кодами выше 0x7f
).
Чтобы закодировать такую строку в 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
, т.е. преобразует строку из одной кодировки в другую.
Некоторые полезные ссылки: