Непонятные глюки с кодировкой и транслитом
Делаю вроде казалось бы тривиальную задачу - транслит строки для ссылок тэгов в блоге.
Но непонятный глюк возник: символы кириллицы куда-то теряются в кодировке... Коды символов абсолютно одинаковые при сравнении, но сами символы теряются и не сравниваются... Так происходит только с кириллицей, латинские буквы и знаки препинания нормально проходят, сами символы нормально проходят если их брать чисто из поста, а если их попробовать переконвертировать получается бред, и кстати разная длина строки, символов к примеру 30, а strlen показывает шо их 59... Но строка вроде как в UTF-8, Content-Type тоже UTF-8, в посте всё нормально, кодировка файлов скриптов тоже UTF-8, конвертил через iconv и уже всё перепробовал... Тривиальная задача такая, тысячу раз делал, но сейчас без понятия, что происходит...
Кто-то может знает в чём может быть прикол?
вот одну функцию пробовал:
{
if (strpos('"\'=+&()^%$#@!`~№;%:?*//*\\', $char) === false)
{
switch ($char)
{
case 'А':
case 'а':
return 'a';
break;
case 'Б':
case 'б':
return 'b';
break;
default:
return $char;
...
}
}
else
return '';
}
потом вот так конвертил
$keywords = mysql_escape_string($_POST['keywords']);
$kw_link = '';
$length = strlen($keywords);
for ($i = 0; $i < $length; $i ++)
$kw_link .= Russian2lat($keywords[$i[);
...
вторую
{
$russian = array('ё','ж','ц','ч','ш','щ','ю','я','Ё','Ж','Ц','Ч','Ш','Щ','Ю','Я');
$latin = array('yo','zh','tc','ch','sh','sh','yu','ya','YO','ZH','TC','CH','SH','SH','YU','YA');
$string = str_replace($russian,$latin,$string);
$string = strtr($string,"АБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭабвгдезийклмнопрстуфхъыьэ","ABVGDEZIJKLMNOPRSTUFH_I_Eabvgdezijklmnoprstufh_i_e");
return($string);
}
и потом:
$keywords = mysql_escape_string($_POST['keywords']);
$kw_link = translateToLat($keywords);
...
и в результате получается каша какая-то в $kw_link...
при чём в переменной $keywords всё нормально.
кстати в первом варианте всё проходит мимо switch, попадая сразу в default...
попробовал вот так:
и так:
каждый раз получаются разные варианты, но всё равно какая-то билиберда... всё вроде как в UTF-8... но способа ж проверить кодировку вроде как нет, так что не уверен... но всё везде вроде в нём... что-то несусветное со строкой происходит
и так:
$kw_link = translateToLat($kw_link);
и так:
$kw_link = translateToLat($kw_link);
не работают оба... а второй вообще пустую строку возвращает, так же не работает ни utf8_decode ни utf8_encode... блин шо ж такое... может шото глобальней с заголовками пакета или ещё каким-то бредом? потому шо коды символы те же... такое впечатление, шо глюк PHP или Apache...
Возможно поможет )
Возможно поможет )
уже пробовал, и в дримуивере ставил кодировку страницы UTF-8...
в $_POST['keywords'] - строка в UTF-8 ? Если так то нужно использовать mysql_real_escape_string().
в $_POST['keywords'] - строка в UTF-8 ? Если так то нужно использовать mysql_real_escape_string().
а mysql_escape_string разве хуже?
Хуже, именно поэтому есть ее real-версия. real заменяет специальные символы, опираясь на кодировку соединения, а mysql_escape_string их пропустит. Кстати,
mysql_escape_string:
This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.
ааа... deprecated... ну всё равно ни одна ни другая ничего не дают никакого результата... всё равно чудеса на виражах(((
1) если это UTF-8 - вызывай utf8_decode() перед любыми операциями над строкой. Когда все сделал, вызывай utf8_encode()
2) если это какая-то KOI8-R, Win-1251 и пр. - делай перекодировку iconv, см. хелп по пхп.
Никаких чудес тут не должно быть.
1) если это UTF-8 - вызывай utf8_decode() перед любыми операциями над строкой. Когда все сделал, вызывай utf8_encode()
2) если это какая-то KOI8-R, Win-1251 и пр. - делай перекодировку iconv, см. хелп по пхп.
Никаких чудес тут не должно быть.
ну я ж говорю, шо кодировка файла UTF-8, в начале всех скриптов шлётся вот это header('Content-Type: text/html; charset=UTF-8'); кодировка страницы тоже UTF-8... данные передаются из input, правда на странице есть ещё TinyMCE, может он вывод каверкает как-то? ну хотя он на textarea подвешен а не на input...
вот это ставил перед выводом
iconv_set_encoding('output_encoding', 'UTF-8');
конвертил через iconv, utf8_decode и utf8_encode... он тупо не различает символы... хотя коды символов одинаковые... единственный вариант может попробовать по кодам символов сравнивать... но это изврат...
уже третий день долбаемся тут, и локально не работает и на серваке тоже... вот реально какие-то чудеса... много раз писал функции транслита... глюк PHP или Apache какой-то...
вот это ставил перед выводом
iconv_set_encoding('output_encoding', 'UTF-8');
конвертил через iconv, utf8_decode и utf8_encode... он тупо не различает символы... хотя коды символов одинаковые... единственный вариант может попробовать по кодам символов сравнивать... но это изврат...
уже третий день долбаемся тут, и локально не работает и на серваке тоже... вот реально какие-то чудеса... много раз писал функции транслита... глюк PHP или Apache какой-то...
всем спасибо заработало))) только не знаю почему...
{
$table = array(
'А' => 'A',
'Б' => 'B',
'В' => 'V',
'Г' => 'G',
'Д' => 'D',
'Е' => 'E',
'Ё' => 'YO',
'Ж' => 'ZH',
'З' => 'Z',
'И' => 'I',
'Й' => 'J',
'К' => 'K',
'Л' => 'L',
'М' => 'M',
'Н' => 'N',
'О' => 'O',
'П' => 'P',
'Р' => 'R',
'С' => 'S',
'Т' => 'T',
'У' => 'U',
'Ф' => 'F',
'Х' => 'H',
'Ц' => 'C',
'Ч' => 'CH',
'Ш' => 'SH',
'Щ' => 'CSH',
'Ь' => '',
'Ы' => 'Y',
'Ъ' => '',
'Э' => 'E',
'Ю' => 'YU',
'Я' => 'YA',
'а' => 'a',
'б' => 'b',
'в' => 'v',
'г' => 'g',
'д' => 'd',
'е' => 'e',
'ё' => 'yo',
'ж' => 'zh',
'з' => 'z',
'и' => 'i',
'й' => 'j',
'к' => 'k',
'л' => 'l',
'м' => 'm',
'н' => 'n',
'о' => 'o',
'п' => 'p',
'р' => 'r',
'с' => 's',
'т' => 't',
'у' => 'u',
'ф' => 'f',
'х' => 'h',
'ц' => 'c',
'ч' => 'ch',
'ш' => 'sh',
'щ' => 'csh',
'ь' => '',
'ы' => 'y',
'ъ' => '',
'э' => 'e',
'ю' => 'yu',
'я' => 'ya',
//'`' => '',
'*' => '',
'%' => '',
'\\' => '-',
'/' => '-',
'~' => '',
'^' => '',
'?' => '',
'!' => '',
'amp;' => 'and',
''' => '',
'#' => '',
'"' => '',
'&' => '',
);
$output = str_replace(array_keys($table), array_values($table),$string);
return $output;
}
string strtr ( string $str , array $replace_pairs )
$replaced = strtr($source, $rep_array);