Преобразование строки неизвестной кодировки в windows-1251

Разбираем кракозябрыОтличное решение для преобразования всевозможных кракозябр на русском языке в неизвестной кодировке в виндовозную кодировку Windows-1251 которое является просто необходимым решением при написании всяческих парсеров контента и тому подобных скриптах было найдено мной в процессе поиска на просторах интернета.

В частности у меня была проблема несовпадения кодировок на различных сайтах и в процессе стягивания контента с одного на другой текст доставлялся в виде красивых однако нифига ни разу не понятных кракозябр а стандартные средства php типа iconv и mbstring не могли распознать что же это за получившаяся в процессе конвертирований кодировка…

Решение было найдено у Юрия Попова в виде модуля charset_x_win. Большой респект и спасибо ему за это!

Описание:

string charset_x_win(string $s);

где $s - cтрока в неизвестной кодировке. В текущей версии функции эта строка может быть в одной из кодировок: windows-1251 koi-8r utf-8. Строка должна быть на русском языке.

Замечание: Поскольку вопрос корректности кодировки не касается символов с кодом меньше 128 то входная строка может быть так же и на английском в транслите или на любом другом языке в котором используются только символы с кодом меньше 128.

Функция правильно обрабатывает буквы Ёё и символы «».

Функция специальным образом оптимизирована для конвертирования коротких фраз. Суть оптимизации состоит в подсчёте недопустимых двух- и трёх-символьных последовательностей для слов русского языка. Для конвертирования больших текстов вполне подходят и более простые методы состоящие в простом подсчёте допустимых/недопустимых символов.

Однако функция может быть использована и для конвертирования текстов значительных размеров. При конвертировании больших текстов для анализа кодировки используется начальный фрагмент текста в котором содержится 256 символов с кодом больше 127.

Работа функции состоит в следующем. Исходная строка последовательно конвертируется из всех предусмотренных кодировок в кодировку windows-1251. Для каждого варианта конвертирования определяется некоторый числовой вес который соответствует степени корректности фразы на русском языке. Этот вес зависит от следующих параметров входной строки:

  1. количество «хороших символов».
    Хорошими считаются символы соответствующие буквам А-Я и а-я. Чем больше хороших символов тем выше вероятность того что кодировка - правильная.
  2. количество «плохих символов».
    Плохими считаются символы с кодом больше 127 но которые не соответствуют буквам А-Я и а-я. Чем больше плохих символов тем меньше вероятность того что кодировка - правильная.
  3. количество недопустимых последовательностей из двух и из трёх символов в русском языке.
  4. Считается что в русском языке не могут встретиться например последовательности из двух символов такие как «аы» или «нъ» или из трёх символов например такие как «юаа» или «йвб». Чем больше в строке таких последовательностей тем меньше вероятность того что кодировка - правильная.

    Пример использования функции charset_x_win().

    echo charset_x_win('ЮЕМПЧЕЛ')."<br />";echo charset_x_win('юемпчел')."<br />";echo charset_x_win('человек')."<br />";echo charset_x_win('ЧЕЛОВЕК')."<br />";echo charset_x_win("человек")."<br />";echo charset_x_win("ЧЕЛОВЕК")."<br />";

    Результат выполнения этого примера:

    человекЧЕЛОВЕКчеловекЧЕЛОВЕКчеловекЧЕЛОВЕК

    Собственно сам скрипт здесь.


Оригинал статьи http://pingvinoff.net/2010/04/10/preobrazovanie-stroki-v-kodirovku-win-1251/

0 комментариев

Оставить комментарий