Как декодировать вывод LTTextLine.get_text()?

Я новичок в PDFminer. Я заметил, что некоторые символы/знаки препинания не выводятся в буквальном виде при использовании команды PDFminer get_text(). Например, «-» получился как «\xe2\x80\x93», а одинарные кавычки ' получился как «\xe2\x80\x99». Вот команда, которую я использовал:

печать (LTTextLine.get_text(). кодировать ('UTF-8'))

Может ли кто-нибудь помочь мне понять, как их читать и преобразовать обратно в буквальную форму?

Спасибо.


person muon3    schedule 31.01.2019    source источник
comment
Я подозреваю, что на самом деле это были не дефисы - (ASCII 45) и одинарные кавычки ' (ASCII 39), а типографские дефисы (Unicode 2010) и правые одинарные кавычки Unicode (Unicode 2019).   -  person BoarGules    schedule 31.01.2019
comment
похоже на \x?? управляющие символы Python, как в stackoverflow.com/questions/2672326/, но я до сих пор не знаю, как правильно кодировать эти символы. Пробовал все кодировки, поддерживаемые utf*, в docs.python.org/3/ library/codecs.html#standard-encodings безрезультатно.   -  person muon3    schedule 01.02.2019


Ответы (1)


Шестнадцатеричные escape-последовательности, которые вам не нравятся, — это не дефисы (ASCII 39) и одинарные кавычки (ASCII 45). Это типографские дефисы (также известные как короткие тире) (Unicode 2010) и правые одиночные («умные») кавычки (Unicode 2019). Они кодируются как UTF-8. Если вы хотите их декодировать, рассматривайте строку, содержащую их, как байты, а не как строку (обратите внимание на префикс b):

>>> mystring = b"This is an en\xe2\x80\x93dash and this - isn\xe2\x80\x99t"
>>> mystring.decode('UTF8')
'This is an en–dash and this - isn’t'

Если Python считает, что данные уже являются строкой, как показано ниже, без префикса b, вам нужно убедить его, что это действительно байты, и расшифровать результат:

>>> mystring = "This is an en\xe2\x80\x93dash and this - isn\xe2\x80\x99t"
>>> bytes(mystring.encode("latin-1")).decode("UTF-8")
'This is an en–dash and this - isn’t'

В шрифте, который использует SO, нет очевидных различий между ASCII 39 и Unicode 2010, но в целом типографский дефис короче, толще и ближе к базовой линии, чем дефис ASCII. Различие между двумя другими довольно ясно в isn’t'. Часто можно найти варианты Unicode в .pdf файлах, потому что они предназначены для печати. Варианты ASCII действительно подходят только для программного кода и эмуляции старых пишущих машинок; непечатные книги и журналы.

person BoarGules    schedule 01.02.2019