Автоматическое определение кодировки

Иногда возникает ситуация, при которой необходимо узнать кодировку текста, который попадает из каких-нибудь внешних источников - например вам надо обработать файл загруженный пользователем или сохранить в базу текст из HTML страницы.

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

Выяснить это можно несколькими способами:

Для текста:

Для HTML:

  1. Посмотреть в мета-теге, например у хабра значение такое ````` К сожалению не всегда эта указывается, а иногда указывается не правильно.
  2. Посмотреть в хедерах ответа сервера - аналогично, никто не заставляет написать там не то, что там на самом деле

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

  1. есть решение, которое использует COM-объекты и маршалинг а значит гарантирует нам муки и головную боль
  2. на форумах, есть предложения анализировать байты на предмет соответствия кодировкам.

К счастью, если заглянуть дальше топа поисковых систем, можно найти гораздо более простое и эффективное решение - Mozilla Universal Charset Detector.

Эта библиотека реализует на .NET (никакого COM) алгоритм определения кодировки, который используется внутри Firefox и работает как раз на анализе массива байт.

Очевидные плюсы по сравнению с решением 1 - стабильность и простота (ставится прямо из нугета), с решением 2 - все уже написано, протестировано и работает

Для того чтобы узнать текста кодировку достаточно написать

var detector = new CharsetDetector();
detector.Feed(bytes, 0, bytes.Length);
detector.DataEnd();
var encoding = detector.Charset;

иногда алгоритм не может определить кодировку и тогда возвращает null, кроме того, когда кодировка определена, в месте с ней в ответе содержится ещё и степень "уверености" алгоритма в своем решении - detector.Confidence.

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


comments powered by HyperComments
Яндекс.Метрика