Это получит Вас массив строк всех ресурсов:
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
Существуют две библиотеки общего назначения для обнаружения неизвестных кодировок:
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% случаев:
Я решил ту же проблему и обнаружил, что нет способа определить тип кодировки контента без метаданных о контенте. Вот почему я пришел к тому же подходу, который вы пытаетесь здесь использовать.
Мой единственный дополнительный совет к тому, что вы сделали, - вместо того, чтобы упорядочивать список возможных кодировок в наиболее вероятном порядке, вы должны упорядочивать его по специфичности . Я обнаружил, что одни наборы символов являются подмножествами других, поэтому, если вы выберете utf_8
в качестве второго варианта, вы пропустите возможность найти подмножества utf_8
(я думаю, что один корейских наборов символов использует то же числовое пространство, что и utf).
Поскольку вы используете Python, вы можете попробовать UnicodeDammit
. Это часть Beautiful Soup , которую вы также можете найти полезной.
Как следует из названия, UnicodeDammit
будет пытаться сделать все возможное, чтобы получить правильный юникод из вашего дерьма. может найти в мире.