setlocale запутался

Тема в разделе "PHP", создана пользователем vilk108, 13 май 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. vilk108

    vilk108

    Регистр.:
    17 дек 2007
    Сообщения:
    174
    Симпатии:
    41
    выполняю на локалке
    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. Это что получается у хостинга настройки не правильные? Как с этим боротся?
     
  2. poikl

    poikl

    Регистр.:
    7 ноя 2006
    Сообщения:
    164
    Симпатии:
    31
    не переводит потому что не понимет русских букв, помоему ето решаеся написание функции для ру букв которая будет перегонять .
     
    vilk108 нравится это.
  3. nnmkayf

    nnmkayf

    Регистр.:
    25 июл 2007
    Сообщения:
    153
    Симпатии:
    98
    Гарантированное решение всех проблем с языком отличным от английского - использование кодировки UTF-8.
    Работает это следующим образом:
    PHP:
    setlocale(LC_ALL'ru_RU.UTF-8'); //не обязательно
    $str "Двадцать пятого ЯнварЯ";
    $strr mb_strtoupper($str,'UTF-8') ;
    print 
    $strr;
    Требует установленного в PHP модуля mbstring
     
    vilk108 нравится это.
  4. spamkit

    spamkit Создатель

    Регистр.:
    21 ноя 2007
    Сообщения:
    25
    Симпатии:
    2
    Немного теории:
    - UTF-8 - кодировка строк.
    - локаль - набор информации о языке и стандартах страны (например валюта, форматы дат, разделители).
    - setlocale требует поддержки требуемой локали хостом.
    - локаль C - одна из стандартных локалей Linux/BSD используемых как абстракция, соответствие стандартам ANSI C.

    Больше узнать об этом можно из документации к Libc.
     
    vilk108 нравится это.
  5. Mendel

    Mendel

    Регистр.:
    27 янв 2008
    Сообщения:
    217
    Симпатии:
    64
    Всегда пишу так:
    PHP:
    // да здравствует мастдайная кодировка
    setlocale(LC_CTYPE, array('ru_RU.CP1251''Russian_Russia.1251'));
    Всегда помогало. еще не встречал хостинга чтобы не работало. Но не обещаю что таких нет :)
    Тоесть можно попытаться обозвать вашу локаль както иначе, но у меня обычно везет либо с одной либо с другой...
     
  6. spamkit

    spamkit Создатель

    Регистр.:
    21 ноя 2007
    Сообщения:
    25
    Симпатии:
    2
    Опять-же, локаль должна быть скомпилированна и доступна. Список доступных локалей на пингвиниксе можно получить так (Debian:( locale -a

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

    Brevis Создатель

    Регистр.:
    6 окт 2007
    Сообщения:
    16
    Симпатии:
    7
    Еще можно обойти проблему с преобразованием регистров написанием своей функции:

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

    Mendel

    Регистр.:
    27 янв 2008
    Сообщения:
    217
    Симпатии:
    64
    на шаредхостинге из php?
    не ну бывают, бывают такие варианты когда и system() доступна и все такое... но это все через одно место.
    если не помогает мой вариант, то надо спросить у хостера, мол а какую мне локаль юзать...
     
  9. strij

    strij Постоялец

    Регистр.:
    31 дек 2006
    Сообщения:
    53
    Симпатии:
    12
    По-моему лучший вариант это(все вместе:(
    1. Использовать UTF-8
    2. Использовать mbstring для работы со строками UTF-8
    3. Использовать Zend_Locale и Zend_Date из Zend Framework. Очень удобно и работает вполне быстро (если к Zend_Locale подключен кэш). Правда PHP 5 only.
     
Статус темы:
Закрыта.