PHP

Как быстро определить кодировку текстовой строки?

Возникла проблема: как быстро определить кодировку текстовой строки относительно UTF-8 Всё чаще приходится работать со строками в кодировке UNICODE.

Ниже представлена функция проверки, нужно ли преобразование кодировки UNICODE (UTF-8) в кодировку WINDOWS (win-1251)

Функция даёт довольно точный ответ, хотя построена не на по-кодовом преобразовании символов.
function detect_my_utf($s){
 $s=urlencode($s); // в некоторых случаях - лишняя операция (закоментируйте)
 $res='0';
 $j=strlen($s);

 $s2=strtoupper($s);
 $s2=str_replace("%D0",'',$s2);
 $s2=str_replace("%D1",'',$s2);
 $k=strlen($s2);

 $m=1;
 if ($k>0){
  $m=$j/$k;
  if (($m>1.2)&&($m<2.2)){ $res='1'; }
 }
 return $res;
}

Кратко - описание функции detect_my_utf():

преобразуем (строку в специальный формат)
вычисляем длину входящей строки
приводим все буквы строки в заглавные
убираем специфические коды %D0 и %D1
вычисляем длину новой строки
получаем соотношение тарой строки к новой

Если это соотношение 1 или близко к нему, то есть подозрение, что входящая строка не кодировалась в UNICODE. Если это соотношение находится в диапазоне от 1,2 до 2,2 - то можно смело перекодировать строку в WINDOWS кодировку win-1251.

На выходе функции имеем 0 или 1, соответственно, не UNICODE или UNICODE.

Примеры выполнения функции:

Пример 1

Входящая строка:
   РїР?С?С?Р?Р?Рє С?Р?Р·Р?Р°Р?РёС? Р°Р?РёР?Р°С+РёРё Р? imageready

Преобразованная строка:
   %D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA
   %D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F
   %D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B8%20%D0%B2 imageready

Закодированная фраза:
порядок создания анимации в imageready

Пример 2

Входящая строка:
   Р?С?Р?Р?Р?С< С?С+РчР+Р?Р?Р?Р? акаР?РчР?РёС+РчС?РєР?Р?Р? С?РёС?С?Р?РєР°

Преобразованная строка:
   %D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B
   %D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%BE%D0%B3%D0%BE
   %D0%B0%D0%BA%D0%B0%D0%B4%D0%B5%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE
   %D1%80%D0%B8%D1%81%D1%83%D0%BD%D0%BA%D0%B0

Закодированная фраза:
основы учебного академического рисунка

Пример 3

Входящая строка:
   РїС?Р?Р?С?Р°Р?Р?Р° С+С'РчР?РёС? РїР?С+Р°С?апаР?Р?С<С: Р?РёС?РєР?Р?

Преобразованная строка:
   %D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0
   %D1%87%D1%82%D0%B5%D0%BD%D0%B8%D1%8F
   %D0%BF%D0%BE%D1%86%D0%B0%D1%80%D0%B0%D0%BF%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
   %D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2

Закодированная фраза:
программа чтения поцарапанных дисков

Пример 4

Входящая строка:
   пособие по рисованию

Преобразованная строка:
   %EF%EE%F1%EE%E1%E8%E5 %EF%EE %F0%E8%F1%EE%E2%E0%ED%E8%FE

Закодированная фраза:
   пособие по рисованию

Данный алгоритм хорошо справляется с разнообразными входящими строками в составе сервиса статистики переходов с поисковых машин.
Добавлено: 24 Августа 2013 01:43:34 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...