[Закрыть]
 
popoff.donetsk.ua
В любом деле самое сложное - начать. Поэтому мы пропускаем начало и считаем, что мы уже начали. /Popoff/
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Статьи - Программирование - Модули - a - charset_x_win
Я это делаю
Персональное меню
Голосование
Деньги, либо любимое занятие? Постоянный адрес этого вопроса
Ваш возраст (не обязательно):

Введите целое число от 3 до 99.
Почему? (не обязательно):
Другие вопросы
Поиск по сайту
Реклама
Программное обеспечение любой сложности
koins.com.ua
Статистика

charset_x_win

Постоянный адрес статьи

charset_x_win -- Преобразовать строку на русском языке из неизвестной кодировки в кодировку windows-1251

Описание

string charset_x_win(string $s);

Требуемая библиотека: a.charset

Конвертирует строку из неизвестной кодировки в кодировку windows-1251.

$s

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



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

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

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

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

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

  1. количество «хороших символов».

    Хорошими считаются символы, соответствующие буквам А-Я и а-я. Чем больше хороших символов, тем выше вероятность того, что кодировка - правильная.

  2. количество «плохих символов».

    Плохими считаются символы, с кодом больше 127, но которые не соответствуют буквам А-Я и а-я. Чем больше плохих символов, тем меньше вероятность того, что кодировка - правильная.

  3. количество недопустимых последовательностей из двух и из трёх символов в русском языке.

    Считается, что в русском языке не могут встретиться, например, последовательности из двух символов такие как «аы» или «нъ» или из трёх символов, например, такие как «юаа» или «йвб». Чем больше в строке таких последовательностей, тем меньше вероятность того, что кодировка - правильная.

Пример использования функции 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 />";

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

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

Смотрите также

Скачать файл скрипта с функцией charset_x_win()
a.charset.php

Иван Рощин. Автоматическое определение кодировки текста
http://ivr.webzone.ru/articles/defcod_2/index.htm

Функция для формирования массивов внутри функции _charset_count_pairs() (можете её использовать, если захотите сформировать свои собственные массивы):
a.charset.ru.builder.php

Последняя модификация: 29.12.09 16:44

Обсуждение статьи в форуме

Не проходите мимо! Оставьте Ваш комментарий в форуме! >>>

22.06.06 01:56 Владимир

Вообще отлично, молодец!
Я б умер такой скрипт писать))

28.07.06 09:30 Алексей Крылов, Ptechka dot ru

Юрию Попову - большое спасибо. Использую в своём парсере поисковых запросов из реферрера, отлично работает.

Кстати, с Я.Маркета приходят люди с такими реферрерами: «http://market.yandex.ru/search.xml?hid=&text=рїсѓр»сњсѓрѕрјрµс‚сђ&grhow=shop&numdoc=&how=pricemin&asc=1&np=1».
И декодировать «рїсѓр»сњсѓрѕрјрµс» не получается ничем... Самое обидное, что я не могу воспроизвести условия, при которых получается такая кракозябра...

p.s. в библиотеке непрописанная функция debug_info - нужно поставить заглушку.

05.08.06 19:42 Imbolc

Респектище :)
Было бы ещё здорово утф16 поддержать...

08.01.07 15:58 гость

Здоровски, очень полезно! Вот только так и не удалось запустить, ибо не определена ф-ия debug_info() - почему так вышло - не знаю. Использую исходной код библиотеки. Попробовал убрать её вызов, но тогда ничего не преобразуется. Как обойти ?

19.01.07 00:47 popoff

Вот только так и не удалось запустить, ибо не определена ф-ия debug_info()

fixed.

08.02.07 11:35 rommul at km dot ru

Огромное спасибо за скрипт. Он меня очень выручил!

13.03.07 11:41 Alex_B

Спасибо! библиотека очень помогла!

15.04.07 14:44 Anton

Спасибо, выручил!

19.04.07 06:57 zer0ne

Гениально! Очень спасибо тебе за труд.

24.04.07 16:13 Aleksey

Очень хорошо работает скрипт. Жалко что нет поддержки UNICODE

25.04.07 21:31 Ctrange

Не вполне корректно отрабатывает спецсимволы и знаки препинания
Из KOI в Win: ... -> ЂЂЂ
 « и » -> и k?

~~~~~ 25 Апр 2007, 21:45 ~~~~~

В продолжение: Заменил функцию
function _charset_utf_win($s)
на
function _charset_utf_win($s)
{

$r = iconv(utf-8, windows-1251, $s);

 

return $r;

}

13.05.07 09:10 Igor

А скрипт суперский еще бы потдержку UTF и было бы суппер.

13.05.07 11:20 popoff

Не вполне корректно отрабатывает спецсимволы и знаки препинания
Из KOI в Win: ... -> ЂЂЂ
« и » -> и k?

Ctrangeфорумы popoff.donetsk.ua


fixed

В продолжение: Заменил функцию
function _charset_utf_win($s)
на
function _charset_utf_win($s)
{

$r = iconv(“utf-8”, “windows-1251”, $s);

return $r;

}

Ctrangeфорумы popoff.donetsk.ua

Not accepted.

Из-за возможности неправильных символов, от которых iconv может тошнить.

еще бы потдержку UTF и было бы суппер.

Igorфорумы popoff.donetsk.ua

Скрипт поддерживает UTF-8.

13.05.07 14:30 Игорь

Да iconv это что то.Кстати твой скрипт меня спас.Спасибо большое за него.Я имел ввиду хорошо бы перекодировка не в windows-1251 а еще бы в UTF-8 то есть функция типа charset_x_utf8

14.05.07 10:08 ИГОРЬ

Да iconv это что то.Кстати твой скрипт меня спас.Спасибо большое за него.Я имел ввиду хорошо бы перекодировка не в windows-1251 а еще бы в UTF-8 то есть функция типа charset_x_utf8

Игорьфорумы popoff.donetsk.ua



И еще добавлю.Ведь счас идет работа именно с UTF-8 тесть windows-1251 отходит в небытие.Имеет смысл сделать перекодировку в UTF-8 с неизвестной кодировки.эТо был бы золотой скрипт Темболее когда есть опыт написания подобного скрипта.

04.06.07 11:02 sweater

Огромное спасибо.
оставь WMZ кошель - искренне хочется сделать небольшое donate :)

04.06.07 21:23 popoff

Пожалуйста:
Z345300577580
:)

25.06.07 08:49 Khabibulin

Все конечно круто! Но как быть с Украинскими символами, такими как іІїЇєЄ?
Помогите пожалуйста, очень надо!

25.06.07 16:47 Sebekon

Отличнейший скрипт, работает очень быстро.
предлагаю добавить перекодировку из unicode
как вариант — использовать вот такую функцию в самом начале:
function unicode_escape($str)
{
$escape_table = array(
  '%20' => ' ',
  '%21' => '!',
  '%2C' => ',',
  '%3A' => ':',
  '%3B' => ';',
  '%u0410' => 'А',
  '%u0411' => 'Б',
  '%u0412' => 'В',
  '%u0413' => 'Г',
  '%u0414' => 'Д',
  '%u0415' => 'Е',
  '%u0401' => 'Ё',
  '%u0416' => 'Ж',
  '%u0417' => 'З',
  '%u0418' => 'И',
  '%u0419' => 'Й',
  '%u041A' => 'К',
  '%u041B' => 'Л',
  '%u041C' => 'М',
  '%u041D' => 'Н',
  '%u041E' => 'О',
  '%u041F' => 'П',
  '%u0420' => 'Р',
  '%u0421' => 'С',
  '%u0422' => 'Т',
  '%u0423' => 'У',
  '%u0424' => 'Ф',
  '%u0425' => 'Х',
  '%u0426' => 'Ц',
  '%u0427' => 'Ч',
  '%u0428' => 'Ш',
  '%u0429' => 'Щ',
  '%u042A' => 'Ъ',
  '%u042B' => 'Ы',
  '%u042C' => 'Ь',
  '%u042D' => 'Э',
  '%u042E' => 'Ю',
  '%u042F' => 'Я',
  '%u0430' => 'а',
  '%u0431' => 'б',
  '%u0432' => 'в',
  '%u0433' => 'г',
  '%u0434' => 'д',
  '%u0435' => 'е',
  '%u0451' => 'ё',
  '%u0436' => 'ж',
  '%u0437' => 'з',
  '%u0438' => 'и',
  '%u0439' => 'й',
  '%u043A' => 'к',
  '%u043B' => 'л',
  '%u043C' => 'м',
  '%u043D' => 'н',
  '%u043E' => 'о',
  '%u043F' => 'п',
  '%u0440' => 'р',
  '%u0441' => 'с',
  '%u0442' => 'т',
  '%u0443' => 'у',
  '%u0444' => 'ф',
  '%u0445' => 'х',
  '%u0446' => 'ц',
  '%u0447' => 'ч',
  '%u0448' => 'ш',
  '%u0449' => 'щ',
  '%u044A' => 'ъ',
  '%u044B' => 'ы',
  '%u044C' => 'ь',
  '%u044D' => 'э',
  '%u044E' => 'ю',
  '%u044F' => 'я',
);   
return strtr($str, $escape_table);
}

тогда функция будет ещё универсальнее.

26.06.07 16:50 noindex

popoff - Вы гений.
Немеренный респект за charset_x_win()...
День убил на борьбу с разными кодировками, Ваш способ единственный дающий 100% результат!

Просмотреть все комментарии в режиме форума. Всего комментариев: 80
Не проходите мимо! Оставьте Ваш комментарий в форуме! >>>