Лучший способ декодировать неизвестную кодировку Unicoding в Python 2.5

У меня есть все правильно? Во всяком случае, я разбираю много html, но я не всегда знаю, какой кодировкой он должен быть (удивительное число об этом говорит). Код ниже легко показывает, что я делал до сих пор, но я уверен, что есть лучший способ. Ваши предложения будут высоко оценены.

import logging import codecs from utils.error import Error class UnicodingError(Error): pass # these encodings should be in most likely order to save time encodings = [ "ascii", "utf_8", "big5", "big5hkscs", "cp037", "cp424", "cp437", "cp500", "cp737", "cp775", "cp850", "cp852", "cp855", "cp856", "cp857", "cp860", "cp861", "cp862", "cp863", "cp864", "cp865", "cp866", "cp869", "cp874", "cp875", "cp932", "cp949", "cp950", "cp1006", "cp1026", "cp1140", "cp1250", "cp1251", "cp1252", "cp1253", "cp1254", "cp1255", "cp1256", "cp1257", "cp1258", "euc_jp", "euc_jis_2004", "euc_jisx0213", "euc_kr", "gb2312", "gbk", "gb18030", "hz", "iso2022_jp", "iso2022_jp_1", "iso2022_jp_2", "iso2022_jp_2004", "iso2022_jp_3", "iso2022_jp_ext", "iso2022_kr", "latin_1", "iso8859_2", "iso8859_3", "iso8859_4", "iso8859_5", "iso8859_6", "iso8859_7", "iso8859_8", "iso8859_9", "iso8859_10", "iso8859_13", "iso8859_14", "iso8859_15", "johab", "koi8_r", "koi8_u", "mac_cyrillic", "mac_greek", "mac_iceland", "mac_latin2", "mac_roman", "mac_turkish", "ptcp154", "shift_jis", "shift_jis_2004", "shift_jisx0213", "utf_32", "utf_32_be", "utf_32_le", "utf_16", "utf_16_be", "utf_16_le", "utf_7", "utf_8_sig" ] def unicode(string): '''make unicode''' for enc in self.encodings: try: logging.debug("unicoder is trying " + enc + " encoding") utf8 = unicode(string, enc) logging.info("unicoder is using " + enc + " encoding") return utf8 except UnicodingError: if enc == self.encodings[-1]: raise UnicodingError("still don't recognise encoding after trying do guess.") 

  • Легкий способ преобразования списка юникодов в список, содержащий строки python?
  • Должен ли я использовать объявление кодирования в Python3?
  • UnicodeEncodeError: кодек «gbk» не может кодировать символ: незаконная многобайтовая последовательность
  • Хороший способ получить кодировку / кодировку ответа HTTP в Python
  • Получить список всех кодировок. Python может кодировать
  • «TypeError: строковый аргумент без кодировки», но строка закодирована?
  • Откуда это происходит: - * - кодирование: utf-8 - * -
  • Легкий способ преобразования списка юникодов в список, содержащий строки python?
  • «TypeError: строковый аргумент без кодировки», но строка закодирована?
  • Python - обработка файлов с смешанным кодированием
  • Использование функций unicode () и encode () в Python
  • СинтаксисError символа не-ASCII
  • 3 Solutions collect form web for “Лучший способ декодировать неизвестную кодировку Unicoding в Python 2.5”

    Для обнаружения неизвестных кодировок существуют две библиотеки общего назначения:

    • charet, часть универсального кормового анализатора
    • UnicodeDammit, часть Beautiful Soup

    Предполагается, что chardet является портом пути, который делает firefox

    Вы можете использовать следующее регулярное выражение для определения utf8 из байтовых строк:

     import re utf8_detector = re.compile(r"""^(?: [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )*$""", re.X) 

    На практике, если вы имеете дело с английским языком, я нашел следующие работы в 99,9% случаев:

    1. если он проходит вышеупомянутое регулярное выражение, это ascii или utf8
    2. если он содержит любые байты от 0x80-0x9f, но не 0xa4, это Windows-1252
    3. если он содержит 0xa4, предположим, что он латинский-15
    4. иначе предположим, что это латинский-1

    Я решил одну и ту же проблему и обнаружил, что нет способа определить тип кодировки контента без метаданных о содержимом. Вот почему я оказался в том же подходе, что и вы здесь.

    Мой единственный дополнительный совет в том, что вы сделали, вместо того, чтобы заказывать список возможных кодировок в наиболее вероятном порядке, вы должны заказать его по специфике. Я обнаружил, что некоторые наборы символов являются подмножествами других, и поэтому, если вы проверите utf_8 как свой второй выбор, вам не utf_8 найти подмножества utf_8 (я думаю, что один из корейских наборов символов использует то же utf_8 пространство, что и utf ).

    Поскольку вы используете Python, вы можете попробовать UnicodeDammit . Это часть Beautiful Soup, которую вы также можете найти полезной.

    Как и название, UnicodeDammit попытается сделать все возможное, чтобы получить правильный юникод из дерьма, который вы можете найти в мире.

    Python - лучший язык программирования в мире.