Возникла проблема: как быстро определить кодировку текстовой строки относительно 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
Закодированная фраза:
пособие по рисованию
Данный алгоритм хорошо справляется с разнообразными входящими строками в составе сервиса статистики переходов с поисковых машин.