Почему скрипты полностью игнорируют setlocale();

bovkun

Новичок
Почему скрипты полностью игнорируют setlocale();

Что могла быть причиной того, что php-скрипты "вдруг" перестали замечать и каким-либо образом реагировать на наличие и даже любые изменения в setlocale ? Игнорирует на все 100! Но и ошибки не выдает... :mad:
 

Demiurg

Guest
а в системе установлена та логаль, которую ты устанавливаешь ?
 

bovkun

Новичок
Не... Что-то сам не пойму...

PHP:
setlocale (LC_ALL,"en");
$date = strftime("%A %d %B %Y");
echo $date;

setlocale (LC_ALL,"ru");
$date = strftime("%A %d %B %Y");
echo $date;
выдает
Thursday 27 May 2004
четверг 27 Май 2004

Значит все нормально....


Тогда не пойму в чем тут дело

Есть функция но она отрабатывает явно как-то не как ожидается...

PHP:
function my_strtolower($str) {	
	return convert_cyr_string(strtolower(convert_cyr_string($str, "w", "i")), "i", "w"); 
};

echo my_strtoupper("сцль_abc_фывапролдж") ;

Результат СЦлЬ_ABC_ФЫвапРолдж

любые изменения в локали по барабану. Что я не так делаю???
 

tony2001

TeaM PHPClub
>convert_cyr_string(strtolower(convert_cyr_string($str, "w", "i")), "i", "w");
это ты зачем делаешь?
"ru" обычно - это и есть cp1251, а ты, похоже, специально в ISO конвертишь, чтобы не работала strtolower().
 

bovkun

Новичок
Да в том то и проблема, что у меня strtolower (и т.п.) работает как часы! А как только сливаю на сервер провайдера скрипты, там полная каша начинается. Они мне втирвали сначала про локали, а потом предложили такой вариант, мотивируя, что функции типа strtolower и strtoupper часто глючат с кирилицей. Типа сначала нужно так win.text -> iso.text -> you_function() -> iso.result -> win.result

Вроде странно, нафига такой ход, если на моем (тестовом) сервере и без этой байды работает...

Но на сервере хостера предложенная ими функция работает нормально, а у меня матня какая-то выходит №;%:?*
 

tony2001

TeaM PHPClub
хостеры насоветовали - у них и спрашивай.
сами грабли разложили - сами пускай и убирают.
 

Profic

just Profic (PHP5 BetaTeam)
echo setlocale (LC_ALL,"ru");
setlocale возвращает установленную локаль (по-моему даже в полной нотации :))
 

bovkun

Новичок
...мда.

Я и этому решению был сразу рад - недели их долбал.

-~{}~ 27.05.04 12:46:

Возвращает Russian_Russia.1251
 

tony2001

TeaM PHPClub
>>"ru" обычно - это и есть cp1251, а ты, похоже, специально в ISO конвертишь, чтобы не работала strtolower().
>Возвращает Russian_Russia.1251
что и требовалось доказать.
 

Profic

just Profic (PHP5 BetaTeam)
bovkun
Аааа, т.е. у них на хостинге iso, а у тебя локально win1251. И тебе нужно, чтобы работало одинаково и там и там?

Если да, то сделай, в своей ф-ции проверку на локаль - и конверти или нет символы перед её вызовом. Но проще им же запустить комманду localedef для генерации ru_RU.CP1251
 

bovkun

Новичок
Profic
Вероятно, так как ты говорьшь...

А про localedef подробней ?

-~{}~ 27.05.04 13:08:

.... или как (хоть приблизительно) должна выглядить функция проверки на локаль?
 

Profic

just Profic (PHP5 BetaTeam)
bovkun
[m]setlocale[/m] - If locale is NULL or "0", the locale setting is not affected, only the current setting is returned.
Следовательно делаешь
PHP:
$curLoc = setlocale (LC_ALL, NULL);
if (strpos ($curLoc, '1251') !== false) {
// тут просто делам нужную ф-цию, без конвертирования
} elseif (strpos ($curLoc, 'ISO') !== false) {
// а тут конвертируем в ISO
// применяем ф-цию
// и конвертим обратно
}
А насчет localedef:
Эта комманда генерит новую локаль для использования. Для её использования нужны права рута и наличие некоторых файликов в нужных каталогах на сервере хостера (если там какой-нить юникс :))
Сама комманда должна быть такой (на линухе точно такая :)
localedef -i ru_RU -f CP1251 ru_RU.CP1251
и можно будет юзать локаль ru_RU.CP1251 или ru_RU.cp1251
 
Сверху