Существует ли библиотечная функция Python, которая пытается угадать кодировку символов некоторых байтов?[дубликат]
-
06-07-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
- Как определить кодировку текста? 9 ответов
Я пишу некоторое программное обеспечение для обработки почты на 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.