setlocale запутался

Статус
В этой теме нельзя размещать новые ответы.

vilk108

Профессор
Регистрация
17 Дек 2007
Сообщения
174
Реакции
39
выполняю на локалке
PHP:
 echo setlocale (LC_ALL, 'RU');
и мне выводит - Russian_Russia.1251 . Выполняю на сервере такойже код и мне ничего не выводит. Это что значит на сервере не стоит кодировка Russian_Russia.1251?
На сервере когда выполняю
PHP:
 echo setlocale (LC_ALL, '');
выводит - С. Что обозначает - С?

На сервере когда выполняю:
PHP:
$str = "Двадцать пятого ЯнварЯ";
$strr = strtoupper($str);
print $strr;
буквы не переводятся в верхний регистр (выводится - Двадцать пятого ЯнварЯ), а на локалке выводится правильно - ДВАДЦАТЬ ПЯТОГО ЯНВАРЯ. Знаю это потому что по умолчанию локаль - C. Это что получается у хостинга настройки не правильные? Как с этим боротся?
 
На сервере когда выполняю:
PHP:
$str = "Двадцать пятого ЯнварЯ";
$strr = strtoupper($str);
print $strr;
буквы не переводятся в верхний регистр (выводится - Двадцать пятого ЯнварЯ), а на локалке выводится правильно - ДВАДЦАТЬ ПЯТОГО ЯНВАРЯ. Знаю это потому что по умолчанию локаль - C. Это что получается у хостинга настройки не правильные? Как с этим боротся?

не переводит потому что не понимет русских букв, помоему ето решаеся написание функции для ру букв которая будет перегонять .
 
выполняю на локалке
PHP:
 echo setlocale (LC_ALL, 'RU');
и мне выводит - Russian_Russia.1251 .
Гарантированное решение всех проблем с языком отличным от английского - использование кодировки UTF-8.
Работает это следующим образом:
PHP:
setlocale(LC_ALL, 'ru_RU.UTF-8'); //не обязательно
$str = "Двадцать пятого ЯнварЯ";
$strr = mb_strtoupper($str,'UTF-8') ;
print $strr;
Требует установленного в PHP модуля mbstring
 
Немного теории:
- UTF-8 - кодировка строк.
- локаль - набор информации о языке и стандартах страны (например валюта, форматы дат, разделители).
- setlocale требует поддержки требуемой локали хостом.
- локаль C - одна из стандартных локалей Linux/BSD используемых как абстракция, соответствие стандартам ANSI C.

Больше узнать об этом можно из документации к Libc.
 
Всегда пишу так:
PHP:
// да здравствует мастдайная кодировка
setlocale(LC_CTYPE, array('ru_RU.CP1251', 'Russian_Russia.1251'));
Всегда помогало. еще не встречал хостинга чтобы не работало. Но не обещаю что таких нет :)
Если в качестве locale передан массив, или после этого аргумента следуют дополнительные аргументы, функция будет использовать элементы массива или аргументы по порядку в качестве имен локали до тех пор, пока установка локали не будет успешной. Это удобно, если одна и та же локаль имеет разное имя в различных системах, или необходимая локаль может отсутствовать в системе.
Тоесть можно попытаться обозвать вашу локаль както иначе, но у меня обычно везет либо с одной либо с другой...
 
Опять-же, локаль должна быть скомпилированна и доступна. Список доступных локалей на пингвиниксе можно получить так (Debian:( locale -a

Пример:
iols3-22-1:~# locale -a
C
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
POSIX
 
Еще можно обойти проблему с преобразованием регистров написанием своей функции:

PHP:
function tolower($str)
{
  $str = strtr($str,
  "абвгдеёжзийклмнорпстуфхцчшщъьыэюя", 
  "АБВГДЕЁЖЗИЙКЛМНОРПСТУФХЦЧШЩЪЬЫЭЮЯ");
  return strtoupper($str);
}
 
Опять-же, локаль должна быть скомпилированна и доступна. Список доступных локалей на пингвиниксе можно получить так (Debian:( locale -a

Пример:
iols3-22-1:~# locale -a
C
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
POSIX

на шаредхостинге из php?
не ну бывают, бывают такие варианты когда и system() доступна и все такое... но это все через одно место.
если не помогает мой вариант, то надо спросить у хостера, мол а какую мне локаль юзать...
 
По-моему лучший вариант это(все вместе:(
1. Использовать UTF-8
2. Использовать mbstring для работы со строками UTF-8
3. Использовать Zend_Locale и Zend_Date из Zend Framework. Очень удобно и работает вполне быстро (если к Zend_Locale подключен кэш). Правда PHP 5 only.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху