Лучший способ декодировать неизвестную кодировку 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 split () на языках (например, китайском), которые не используют пробелы в качестве разделителя слов?
  • Как писать русские символы в файле?
  • Правильно извлеките Emojis из строки Unicode
  • pyPdf игнорирует новые строки в файле PDF
  • Распечатайте знак / знак одобрения (✓) U + 2713 в Python
  • Unicode (UTF-8) чтение и запись файлов в Python
  • (unicode error) 'unicodeescape' кодек не может декодировать байты в позиции 2-3: усеченный \ UXXXXXXXX escape
  • Помогите мне понять, почему Unicode работает иногда с Python
  • 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 попытается сделать все возможное, чтобы получить правильный юникод из дерьма, который вы можете найти в мире.

    Interesting Posts

    Django: GET css возвращает 404?

    Настройка двух разных типов пользователей в Django 1.5 / 1.6

    Замена определенных слов в строке (Python)

    Вызов Jython из Python (или наоборот)

    Кэширование (поддельного) статического содержимого, которое фактически является динамическим для GAE для Python

    Обратный для 'index' с аргументами '()' и аргументами ключевого слова '{}' не найден. 0 образцов (-ов):

    Массив NumPy не является сериализуемым JSON

    Python PyQt: Как перенести мои виджеты в окно с помощью мыши?

    Прокрутите список в Python и измените его.

    Свертка двух трехмерных массивов с дополнением с одной стороны слишком медленная

    Intels Open Source uPNP SDK Имеет абсолютно 0 документации, почему?

    Как gauss-filter (размытие) массива nump с плавающей запятой

    Python: отладка утечки памяти

    проверить, какие файлы открыты в Python

    Преобразование строки в форматированную строку даты-времени с использованием Python

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