Лучший способ декодировать неизвестный unicoding, кодирующий в Python 2.5 [дубликат]

Это получит Вас массив строк всех ресурсов:

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
7
задан Craig McQueen 28 January 2010 в 05:27
поделиться

3 ответа

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

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, предположим это latin-15
  4. , иначе предположим, что это latin-1
10
ответ дан 6 December 2019 в 19:38
поделиться

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

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

2
ответ дан 6 December 2019 в 19:38
поделиться

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

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

1
ответ дан 6 December 2019 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: