Транслитерация(strtr) и UTF-8

BoTa

Новичок
Транслитерация(strtr) и UTF-8

Использовал вот такую функцию для транслитерации:
PHP:
 function translit($string)
 {
   $string = preg_replace('{[^\w ]}s', '', $string);
   $string = preg_replace('{[ ]+}', ' ', $string);

   $string = strtr($string,
   "абвгдежзийклмнопрстуфхыэАБВГДЕЖЗИЙКЛМНОПРСТУФХЫЭ",
   "abvgdegziyklmnoprstufhieABVGDEGZIYKLMNOPRSTUFHIE");

   $string = strtr($string, array(
   'ё'=>"yo", 'ц'=>"ts", 'ч'=>"ch", 'ш'=>"sh", 'щ'=>"shch", 'ъ'=>'', 'ь'=>'', 'ю'=>"yu", 'я'=>"ya",
   'Ё'=>"Yo", 'Ц'=>"Ts", 'Ч'=>"Ch", 'Ш'=>"Sh", 'Щ'=>"Shch", 'Ъ'=>'', 'Ь'=>'', 'Ю'=>"Yu", 'Я'=>"Ya"
   ));

   return $string;
 }
Все было хорошо пока был win-1252. А вот в UTF-8 strtr() заменяет буковки не корректно, выдавая подобное:
PHP:
translit('абвгдеёжзийклмнопрстуфхшщцчьъыэюя')
дает подобный результат: "GGGeGzGyGlIGGGsGGhGGBGGGEGZIYILIIPIIIIIII�I�IIEI�I�"
 

Кощей

if(!$needle) die("ooh");
Я для такой штуки использую класик Transliter с сайта phpclasses.org всё делает и кодировки разные понимает и отдаёт в какой хочеш кодировке, только небыло украинской i , чучуть переписал и теперь отлично транслитит.
 

alexcrown

Новичок
Простые буквы тоже оформи как массив: 'а'=>'a','б'=>'b','в'=>'v','г'=>'g',...
strtr всё равно какая у тебя локаль. Она заменяет по байтам. Но в utf-8 длина символа от одного до четырёх байт (для русских букв 2 байта, для латиницы - 1 байт), что делает соответствие символов совсем не таким, как ты ожидаешь.
 

BoTa

Новичок
Автор оригинала: Кощей
Я для такой штуки использую класик Transliter с сайта phpclasses.org всё делает и кодировки разные понимает и отдаёт в какой хочеш кодировке, только небыло украинской i , чучуть переписал и теперь отлично транслитит.
Что-то не могу найти такой классик на phpclasses.org

-~{}~ 05.04.08 15:21:

Автор оригинала: Luerssen
[m]mb_strtr[/m] и [m]mbstring.func_overload[/m]
Вы у уверены что такие функции существуют?
 

Beavis

Banned
BoTa
нет, в мануале про них написали, а в PHP забыли добавить))
 

BoTa

Новичок
Автор оригинала: Beavis
BoTa
нет, в мануале про них написали, а в PHP забыли добавить))
Из мана:
Sorry, but the function mb_strtr is not in the online manual. Perhaps you misspelled it, or it is a relatively new function that hasn't made it into the online documentation yet. The following are the 20 functions which seem to be closest in spelling to mb_strtr (really good matches are in bold).
 

Армян

Новичок
наверно он имел введу это, можно было бы догадатся
http://www.php.net/mb_strstr
 

BoTa

Новичок
Не обессудьте, увидел. Но задачу решил с помощью класса Translit(http://www.phpclasses.org/browse/package/3897.html), там все сделано replace'ом.

-~{}~ 05.04.08 21:53:

Подскажите пожалуйста, почему функция mb_strtoupper не переводит текст в верхний регистр? И еще все функции mb_* не понимают букву 'е'.

-~{}~ 05.04.08 22:02:

Проблема решена.
PHP:
mb_http_input('UTF-8');
mb_http_output('UTF-8');
mb_internal_encoding("UTF-8");
Всем спасибо :)
 
Сверху