Функция транслита спотыкается на нескольких буквах

VANHALEN

Новичок
Здравствуйте.. Есть у меня подруга, которая любит заголовки капс-локом писать. Переделывая ей сайт, использовал функцию для создания алиасов к статьям. Внезапно, ни с того ни с сего, фунция начала спотыкаться на заглавные буквы Ч и Я (других пока не заметил). Причём до этого я сделал эти алиасы автоматом (написал скрипт который берёт из базы заголовки, транслитерирует и записывает в поле алиаса) . А тут полез в админку что-то поправить - бац и такая вот беда.
Собственно функция.
PHP:
function translit($insert) 
{ 
	setlocale (LC_ALL, 'ru_RU.CP1251');
	$insert = mb_strtolower($insert);	// Если работаем с юникодными строками
	//$insert = strtolower($insert); // Все почему-то упорно переводят и заглавные и прописные, а потом делают strtolower Я сделал сразу, тем самым уменьшив массив
	$replase = 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',
	'Ч'=>'ch',
	'ш'=>'sh',
	'щ'=>'shh',
	'ъ'=>'j',
	'ы'=>'y',
	'ь'=>'',
	'э'=>'e',
	'ю'=>'yu',
	'я'=>'ya',
	//'Я'=>'ya',
	// Всякие знаки препинания и пробелы
	' '=>'-',
	' - '=>'-',
	'_'=>'-',
	'–'=>'-',
	' – '=>'-',
	//Удаляем
	'.'=>'',
	'№'=>'',
	'«'=>'',
	'»'=>'',
	':'=>'',
	';'=>'',
	','=>'',
	'!'=>'',
	'?'=>'',
	'>'=>'',
	'<'=>'',
	'&'=>'',
	'*'=>'',
	'%'=>'',
	'$'=>'',
	'"'=>'',
	'\''=>'',
	'('=>'',
	')'=>'',
	'`'=>'',
	'+'=>'',
	'/'=>'',
	'\\'=>'',
    );
	$insert=preg_replace("/  +/"," ",$insert); // Удаляем лишние пробелы
    $insert = strtr($insert,$replase);
	return $insert;
}
Кодировка документа и базы cp1251. Сервер локальный - на денвере. Использую этот скрипт постоянно и во многих местах. Такой херни не наблюдалось. Может есть в функции какая-то явная ошибка, которую я понять не могу? все буквы до и после указанных переводятся нормально, а в середине как есть - торчит Я или Ч и алиас уже естественно не работает. Кстати, маленькими буквами всё путём.
 

fixxxer

К.О.
Партнер клуба
1) С чего ты взял, что mb_strtolower в курсе про cp1251?
2) Я совершенно не уверен, что в windows есть локаль "ru_RU.CP1251".
3) replace пишется так, как я написал, а не иначе
 

VANHALEN

Новичок
С чего ты взял, что mb_strtolower в курсе про cp1251?
Это для реального сервера.
replace пишется так, как я написал, а не иначе
Вау! А как же оно тогда вообще работает..
Я совершенно не уверен, что в windows есть локаль "ru_RU.CP1251".
А на Linux сервере?

Вобщем ясности не добавилось.. За replace отдельное спасибо!
 

baev

‹°°¬•
Команда форума
Это для реального сервера.
— какая разница для какого сервера? Читайте документацию mb_strtolower:
В отличие от strtolower(), то что символ является буквой определяется на основании свойств символа Юникода. Таким образом на поведение функции не влияют региональные настройки системы…
 

VANHALEN

Новичок
какая разница для какого сервера? Читайте документацию mb_strtolower:
А была ситуация, что у меня на локальном работал одно время только strtolower, а на реальном mb_strtolower. Вроде с этого началось.. Я сейчас точно не вспомню.. Беда в роде была в том, что в одном из вариантов, не транслитерировалась первая заглавная буква. Но я опять же не понимаю, как даже при допущеных мною ошибках всё работает, а точнее работало. Сейчас ещё воспользуюсь советом fixxxer'а, посмотрим как будет
 

VANHALEN

Новичок
Пишу как правильно советовали - replace
Ответ:
Warning: strtr() [function.strtr]: The second argument is not an array
Как это обьяснить?

БЛЯ! НУ Я И ИДИОТ :)
Всё.. нормально.. Какая блин разница как пишется имя переменной.. :) хоть zamenit
Видимо с утра совсем с головой не дружил. пол дня ходил уверенный в том, что неправильно написал имя функции..
 
Сверху