Как угадать кодировку файла без спецификации в .NET? - PullRequest
6 голосов
/ 29 марта 2009

Я использую класс StreamReader в .NET так:

using( StreamReader reader = new StreamReader( "c:\somefile.html", true ) {
    string filetext = reader.ReadToEnd();
}

Это прекрасно работает, когда файл имеет спецификацию. У меня возникли проблемы с файлом без спецификации ... в основном я получил бред. Когда я указал Encoding.Unicode, он работал нормально, например:

using( StreamReader reader = new StreamReader( "c:\somefile.html", Encoding.Unicode, false ) {
    string filetext = reader.ReadToEnd();
}

Итак, мне нужно получить содержимое файла в строку. Так как люди обычно справляются с этим? Я знаю, что не существует решения, которое будет работать 100% времени, но я бы хотел улучшить свои шансы .., очевидно, существует программное обеспечение, которое пытается угадать (например, блокнот, браузеры и т. Д.) Есть ли метод в .NET Framework, который будет угадывать для меня? У кого-нибудь есть код, которым он хотел бы поделиться?

Дополнительные сведения: этот вопрос почти такой же, как у меня, но я нахожусь в .NET земле. Этот вопрос привел меня в блог, в котором перечислены различные библиотеки обнаружения кодировки , но ни одна из них не находится в .NET

Ответы [ 8 ]

7 голосов
3 голосов
/ 29 марта 2009

Вы должны прочитать эту статью Раймонда Чена. Он подробно рассказывает о том, как программы могут угадать, что такое кодировка (и о том, какое удовольствие доставляет догадка)

http://blogs.msdn.com/oldnewthing/archive/2004/03/24/95235.aspx

1 голос
/ 21 июня 2011

Мне повезло с Pude , C# портом Mozilla Universal Charset Detector.

0 голосов
/ 29 апреля 2011

См. Мой (недавний) ответ на этот (насколько я могу судить, эквивалентный) вопрос: Как определить кодировку / кодовую страницу текстового файла

Он НЕ пытается угадать диапазон возможных «национальных» кодировок, как, например, MLang и NCharDet, а скорее предполагает, что вы знаете, с какими не-юникодными файлами вы, скорее всего, столкнетесь. Насколько я могу судить по вашему вопросу, он должен достаточно надежно решать вашу проблему (не полагаясь на «черный ящик» MLang).

0 голосов
/ 29 марта 2009

Хакерская техника может заключаться в том, чтобы взять MD5 текста, затем декодировать текст и перекодировать его в различных кодировках, каждый из которых использует MD5. Если кто-то соответствует, вы предполагаете, что это та кодировка.

Это явно слишком медленно для чего-то, что обрабатывает много файлов, но для чего-то вроде текстового редактора я мог видеть, как это работает.

Кроме этого, будет просто грязно портировать java-библиотеки из этого поста , которые пришли из вопроса Delphi SO, или использовать функцию IE MLang.

0 голосов
/ 29 марта 2009

Использовать IsTextUnicode в Win32.

В общем смысле это сложная проблема. Смотри: http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx.

0 голосов
/ 29 марта 2009

Я использовал это, чтобы сделать нечто подобное некоторое время назад:

http://www.conceptdevelopment.net/Localization/NCharDet/

0 голосов
/ 29 марта 2009

UTF-8 спроектирован таким образом, что вряд ли текст будет кодироваться в произвольной 8-битной кодировке, такой как latin1, декодируемой в надлежащий Unicode с использованием UTF-8.

Итак, минимальный подход такой (псевдокод, я не говорю .NET):

попробовать: u = some_text.decode ("UTF-8") кроме UnicodeDecodeError: u = some_text.decode ("наиболее вероятная кодировка")

Для наиболее вероятного кодирования обычно используется, например, латиница 1 или cp1252 или что-то еще. Более сложные подходы могут попытаться найти пары символов для конкретного языка, но я не знаю, что делает это в виде библиотеки или чего-то подобного.

...