Kokoc
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Я вот сочинил "универсальный" перекодировкщик переменных, передаваемых методом POST (GET наверное тоже). Перекодирутся строки в формате UTF-8 (\xD0\xB2\xD0\xA1...), unicode (%u043B%u0435%u0431), ASCII ("ИВАНОВ"), url-encoded ("%C5%CE%CF"). Прочие кодировки кириллицы (koi8 и т.п.) не обрабатываются. Код: $win_utf = array( 'А' => 0x0410, 'Б' => 0x0411, 'В' => 0x0412, .. и т.д. - сокращено. И так понятно.) $utf_win=aray_flip($win_utf); // Возвращает true, если unicode или false если ASCII function detect_utf($str) { $is_ascii=0; $is_utf=0; $i=0; while($i<strlen($str)) { $byte1 = ord(substr($str,$i++,1)); if(($byte1 & 0xF0) == 0xD0) { $byte2=ord(substr($str,$i++,1)); if(($byte2 & 0xC0) == 0x80) { $is_utf++; } else { $is_ascii++; } } else { $is_ascii++; } } return ($is_utfi>$is_ascii); } function utf_rep16($e) { global $utf_win; $c=intval($e[1],16); return (array_key_exists($c,$utf_win)) ? $utf_win[$c] : $e[1]; } // Основная функция перекодировния. Параметр - значение переменной, // переданной через POST или GET. Подразумевается, что присутствует только // кириллица. Возвращает строку в кодировке windows-1251 function utf2win($ustr) { global $win_utf, $utf_win; $ustr=rawurldecode($ustr); if(strstr($ustr,"%u")) { $out_str=preg_replace_callback("/%u([\d|A-F]{4})/","utf_rep16",$ustr); } else { if(detect_utf($ustr)) { if(function_exists("mb_convert_encoding")) { $out_str=mb_convert_encoding($ustr,"WINDOWS-1251","UTF-8"); } else { $out_str=""; $i=0; while($i<strlen($ustr)) { $byte1=ord(substr($ustr,$i++,1)); if(($byte1 & 0xF0) == 0xD0) { $byte2=ord(substr($ustr,$i++,1)); $word = (($byte1 & 0x1F) << 6) + ($byte2 & 0x3F); if(array_key_exists($word,$utf_win)) { $out_str.=$utf_win[$word]; } else { $out_str.='?'; } } else { $out_str.=$byte1; } } // while } } else { $out_str=$ustr; } } return $out_str; } |
|