Вопрос

Я использую класс 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 метод, который угадает за меня?Есть ли у кого-нибудь код, которым он хотел бы поделиться?

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

Это было полезно?

Другие советы

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

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

мне повезло с Пуде, а C# порт Mozilla Universal Charset Detector.

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

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

пытаться:u = some_text.decode ("utf-8"), кроме Unicodedecodeerror:u = some_text.decode("наиболее вероятное кодирование")

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

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

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

Используйте IsTextUnicode Win32.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top