Существует ли библиотечная функция Python, которая пытается угадать кодировку символов некоторых байтов?[дубликат]

StackOverflow https://stackoverflow.com/questions/269060

Вопрос

На этот вопрос уже есть ответ здесь:

Я пишу некоторое программное обеспечение для обработки почты на Python, которое сталкивается со странными байтами в полях заголовка.Я подозреваю, что это просто искаженная почта;само сообщение утверждает, что является us-ascii, поэтому я не думаю, что существует истинная кодировка, но я хотел бы получить строку unicode, приближенную к исходной, не добавляя UnicodeDecodeError.

Итак, я ищу функцию, которая принимает str и, при желании, несколько подсказок и делает все возможное, чтобы вернуть мне unicode.Конечно, я мог бы написать одну из них, но если такая функция существует, то ее автор, вероятно, немного глубже задумался о том, как лучше всего это сделать.

Я также знаю, что дизайн Python предпочитает явное неявному и что стандартная библиотека предназначена для того, чтобы избежать неявной магии при декодировании текста.Я просто хочу прямо сказать: "продолжайте и угадывайте".

Это было полезно?

Решение 3

Насколько я могу судить, стандартная библиотека не имеет функции, хотя написать ее, как было предложено выше, не так уж сложно.Я думаю, что на самом деле я искал способ декодировать строку и гарантировать, что она не вызовет исключения.Параметр errors для string.decode делает это.

def decode(s, encodings=('ascii', 'utf8', 'latin1')):
    for encoding in encodings:
        try:
            return s.decode(encoding)
        except UnicodeDecodeError:
            pass
    return s.decode('ascii', 'ignore')

Другие советы

+1 для шардэ модуль (предложенный @insin).

Его нет в стандартной библиотеке, но вы можете легко установить его с помощью следующей команды:

$ pip install chardet

Пример:

>>> import chardet
>>> import urllib
>>> detect = lambda url: chardet.detect(urllib.urlopen(url).read())
>>> detect('http://stackoverflow.com')
{'confidence': 0.85663169917190185, 'encoding': 'ISO-8859-2'}    
>>> detect('https://stackoverflow.com/questions/269060/is-there-a-python-lib')
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Видишь Установка Pip если у вас его нет.

Возможно, вас заинтересует Универсальный Детектор Кодирования.

Лучший способ сделать это, который я нашел, - это итеративно пытаться декодировать перспективу с помощью каждой из наиболее распространенных кодировок внутри блока try except.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top