Как найти правильную кодировку в python? [дубликат]
На этот вопрос уже есть ответ здесь:
Определите кодировку текста в Python
8 ответов
Я пытаюсь избавиться от диакритики в моем текстовом файле. Я преобразовал pdf-файл в текст с помощью инструмента, сделанного не мной. Я не мог понять, какую кодировку они используют. Текст написан на языке науатль , орфографически знаком с Испанский.
Я преобразовал текст в список строк. Нет, я пытаюсь сделать следующее:
# check whether there is a not-ascii character in the item
def is_ascii(word):
check = string.ascii_letters + "."
if word not in check:
return False
return True
# if there is a not ascii-character encode the string
def to_ascii(word):
if is_ascii(word) == False:
newWord = word.encode("utf8")
return newWord
return word
То, что я хочу получить,-это unicode-версия моей строки. Это не работает до сих пор, и я попробовал несколько кодировок, таких как latin1, cp1252, iso-8859-1. Кто-нибудь может сказать мне, что я сделал не так?
Как я могу найти правильную кодировку?
Спасибо!
EDIT :
Я написал людям, которые разработали конвертер (pdf-txt), и они сказали, что они уже использовали unicode. Итак, Джон Мэчин был прав с (1) в своем ответе.
Как я писал в некоторых комментариях, которые мне не были понятны, потому что в отладчике Eclipse сам список показывал некоторые знаки в уникодах, другие нет. И если я смотрел на элементы отдельно, они все были каким-то образом декодированы, так что я действительно видел unicode.
Спасибо за вашу помощь!
2 ответов:
отредактируйте свой вопрос, чтобы показать версию Python, которую вы используете. Угадать версию из вашего кода невозможно. Используете ли вы Python 3.X или 2.X имеет большое значение. следующие замечания предполагают Python 2.x.
Похоже, вы уже определили, что у вас есть кодированный текст UTF-8. Попробуйте
the_text.decode('utf8'). Примечание декодировать, а не кодировать.Если декодирование с помощью UTF-8 не вызывает
Если вышеперечисленное не работает, покажите нам результатUnicodeDecodeErrorи ваш текст не является тривиально коротким, то это очень близко к определенному, что UTF-8 является правильная кодировка.print repr(the_text). Обратите внимание, что это контрпродуктивно пытаться проверить, закодирован ли файл в ASCII-ASCII является подмножеством UTF-8. Оставлять некоторые данные в виде объектовstr, а другие в виде объектовunicode- это грязно в Python 2.x и не будет работать в Python 3.X В любом случае, ваша первая функция не делает того, что вы думаете; она возвращаетFalseдля любой входной строки, длина которой равна 2 или более. Пожалуйста, подумайте модульное тестирование функционирует по мере их написания; впоследствии это значительно ускоряет отладку. Обратите внимание, чтоlatin1иiso-8859-1- это одна и та же кодировка. Посколькуlatin1кодирует первые 256 кодовых точек в Юникоде в том же порядке, то невозможно получитьUnicodeDecodeError, возведенное вtext.decode('latin1'). "Отсутствие ошибки" в данном случае имеет ровно нулевое диагностическое значение.Update в ответ на этот комментарий от OP:
Я использую Python 2.7. Если я использую текст.декодирование ("utf8") вызывает следующие вопросы ошибка: UnicodeEncodeError: кодек 'latin-1' не может кодировать символ u '\u2014 ' в позиции 0: порядковый номер не в диапазоне (256).
Это может произойти двумя способами:
(1) в одном утверждении типа
foo = text.decode('utf8'),textэто уже объект unicode так что Python 2.X пытается закодировать его, используя кодировку по умолчанию (latin-1 ???).(2) возможно в двух различных операторах, первый
Я не могу понять, почему вы "отметили" мой ответ как правильный. Никто еще не знает, о чем идет речь!foo = text.decode('utf8'), гдеtext- объектstr, закодированный в UTF-8, и это утверждение не вызывает ошибка, за которой следует что-то вродеprint fooи ваша sys.стандартный вывод.кодировкаlatin-1(???).Пожалуйста, отредактируйте ваш вопрос , чтобы показать ваш код (вставьте
print repr(text)непосредственно перед строкойtext.decode("utf8")) и результат его выполнения. Покажите результат repr() и полную обратную трассировку (чтобы мы могли определить, какая строка вызывает ошибку).Я снова спрашиваю: Вы можете сделать свой файл доступно для анализа?
Кстати,
И чтобы ответить на ваш последний вопрос, нет, вы не должны пытаться декодировать свой текст, используя каждый кодек в известной вселенной. Вы уже получаете правдоподобный Unicode; что-то (ваш код?) расшифровывает что-то каким-то образом-наличиеu'\u2014'- это "EM DASH" и является допустимым символом вcp1252(но не вlatin-1, как вы видели из сообщения об ошибке). Какую версию операционной системы вы используете?u'\u2014'является достаточным доказательством об этом. Просто покажите нам ваш код и его результаты.
Если вы прочитали несколько байтов и хотите интерпретировать их как строку
unicode, то вы должны использовать.decode(), а неencode().Как сказал @ delnan в комментарии, я надеюсь, что вы знаете кодировку. Если нет, то догадки должны идти легко, как только вы исправите используемую функцию.
Кстати, даже если в этом слове есть только символы ASCII, почему бы и не
.decode()? У вас везде будет один и тот же тип данных (unicode), что упростит вашу программу.
Comments