Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > strtolower русский текст


Автор: mistero 23.7.2007, 19:19
Здравствуйте.
Применяю функцию strtolower(), но на кириллицу не влияет.
Что делать?

Автор: belousov 23.7.2007, 19:26
mistero, А в настройках php кодировку смотрел? она влияет на кодировку однозначно

Автор: FlameTH 23.7.2007, 19:33
Это ошибки в компиляции пхп. Просто смените версию на более новую. У меня возникали проблемы в этом и никакие настройки не помогали.

Автор: belousov 23.7.2007, 19:35
Да кстати правильная мысль, какая версия php у тя?

Автор: Mal Hack 23.7.2007, 19:37
FlameTH, теперь что, вместо любого Parse Error будем более новую версию ставить?
И компиляция тут не причем, как и настройка... Вот кодировка сервера - да, влияет, а кодировка, прописанная в php.ini, как показывает практика - редко.

mistero, в принципе, тут уже неоднократно обсуждалось. setlocale() надо прописать.

Автор: mistero 23.7.2007, 19:38
Цитата(belousov @ 23.7.2007,  19:35)
Да кстати правильная мысль, какая версия php у тя?

php 4.4.4

Автор: FlameTH 23.7.2007, 19:42
Mal Hack, поверь. Это я уже пробовал и локалями. Я держу собственный сервак с кодировками все норм. И только когда я сменил пхп все нормально запахало. Вот так.

Автор: mistero 23.7.2007, 19:44
Цитата(FlameTH @ 23.7.2007,  19:33)
Это ошибки в компиляции пхп. Просто смените версию на более новую. У меня возникали проблемы в этом и никакие настройки не помогали.

Извиняюсь за ламерство, но можно ли как-нить на сервере врубить поддержку пхп 5? Локали у меня тоже не пашут.

Автор: FlameTH 23.7.2007, 19:45
Обновите пхп до версии 5+

Автор: Mal Hack 23.7.2007, 20:28
Не верю. Либо предоставьте доказательства бага на вашей предыдущей версии, который обязательно висит на багтрекере php.net, т.к. такая проблема наверняка бы подняла многих бы людей...

4 ветку я всюиспользовал. И все было нормально. Другой вопрос, что система не знала кирилической кодировки. Тут уж ничего не поможет.

Автор: smartov 23.7.2007, 21:39
mistero, зависит от Вашей локальной кодировки. Если кодировка не Unicode (UTF-8), то нужно установить локаль, как Вам и подсказывают, если же unicode, то можно поставить (или не ставить если уже есть) и использовать расширение multibyte strings.

http://php.net/mb_strtolower

Автор: SelenIT 23.7.2007, 22:20
На самый крайний случай можно сделать свою замену strtolower - через strtr. Как это ни смешно, но это, наверное, самый надежный вариант для идеальной переносимости...

Автор: Mal Hack 24.7.2007, 13:43
smartov, я несколько поясню, правда, не для тебя, ты-то это хорошо понимаешь, просто по лексической нагрузке разы тебя могут несколько не правильно понять.

multibyte strings надо использовать, когда вы работаете со строками, которые 100% находятся в кодировке utf, к примеру данные с формы на сайте, где utf прописанат через <meta>.

Автор: smartov 24.7.2007, 16:44
Mal Hack, 
Цитата(Mal Hack @  24.7.2007,  12:43 Найти цитируемый пост)
просто по лексической нагрузке разы тебя могут несколько не правильно понять.

Да спасибо. Действительно перечитал могут неверно понять.
Конечно речь о том, что если данные в кодировке utf-8 то mb_....

Автор: Fally 25.7.2007, 14:38
http://php.net/setlocale?

Автор: bizmik 4.12.2007, 04:30
Цитата(mistero @ 23.7.2007,  19:19)
Здравствуйте.
Применяю функцию strtolower(), но на кириллицу не влияет.
Что делать?

разбирался с setlocale и нифига не работало. Потом плюнул и за 2 минуты написал простую функцию 
Код

function lower($ch)
{
    $arr = array(
     'A' => 'а',
     'Б' => 'б',
     'В' => 'в',
     'Г' => 'г',
     'Д' => 'д',
     'Е' => 'е',
     'Ё' => 'е',
     'Ж' => 'ж',
     'З' => 'з',
     'И' => 'и',
     'К' => 'к',
     'Л' => 'л',
     'М' => 'м',
     'Н' => 'н',
     'О' => 'о',
     'П' => 'п',
     'Р' => 'р',
     'С' => 'с',
     'Т' => 'т',
     'У' => 'у',
     'Ф' => 'ф',
     'Х' => 'х',
     'Ц' => 'ц',
     'Ч' => 'ч',
     'Ш' => 'ш',
     'Щ' => 'щ',
     'Э' => 'э',
     'Ю' => 'ю',
     'Я' => 'я');

if(@array_key_exists($ch, $arr))$ch = $arr[$ch];
 return $ch;
    };



Ну и пользуюсь так $art = strtolower(lower($art));
, все прекрасно переводи и кирилицу и латиницу и наплевать на какие-то там локали. 

Юзайте. 

Автор: Sannis 4.12.2007, 10:39
Ну, для символа-то прокатит, а если в $art строка?

Автор: Anarki 4.12.2007, 11:57
Цитата(Sannis @ 4.12.2007,  13:39)
Ну, для символа-то прокатит, а если в $art строка?

Код

<?php
function _lower($ch) {
    $arr = array(
     'А' => 'а',
     'Б' => 'б',
     'В' => 'в',
     'Г' => 'г',
     'Д' => 'д',
     'Е' => 'е',
     'Ё' => 'е',
     'Ж' => 'ж',
     'З' => 'з',
     'И' => 'и',
     'К' => 'к',
     'Л' => 'л',
     'М' => 'м',
     'Н' => 'н',
     'О' => 'о',
     'П' => 'п',
     'Р' => 'р',
     'С' => 'с',
     'Т' => 'т',
     'У' => 'у',
     'Ф' => 'ф',
     'Х' => 'х',
     'Ц' => 'ц',
     'Ч' => 'ч',
     'Ш' => 'ш',
     'Щ' => 'щ',
     'Э' => 'э',
     'Ю' => 'ю',
     'Я' => 'я');

    if(array_key_exists($ch, $arr)) {
        $ch = $arr[$ch];
    }
    return $ch;
}
function lower($st) {
    $out = '';
    for($i=0;$i<strlen($st);++$i) {
        $out .= _lower($st{$i});
    }
    return $out;
}
// пример использования
echo lower('РАБОТАЕТ ОТЛИЧНО!');

Автор: smartov 4.12.2007, 18:35
bizmik, 
Anarki, фи, это ж костыли smile

Автор: Anarki 5.12.2007, 12:57
Цитата(smartov @ 4.12.2007,  21:35)
bizmik, 
Anarki, фи, это ж костыли smile

Они сами просили...

Автор: capitan 13.12.2007, 16:22
Нужно просто читать ман до конца. Там есть пример:
Код

function cyr_strtolower($a) {
        $offset=32;
        $m=array();
        for($i=192;$i<224;$i++)$m[chr($i)]=chr($i+$offset);
        return strtr($a,$m);
}
function cyr_strtoupper($a) {
        $offset=32;
        $m=array();
        for($i=192;$i<224;$i++)$m[chr($i+$offset)]=chr($i);
        return strtr($a,$m);
}

ex:
 cyr_strtoupper("абвгде"); // АБВГДЕ
 cyr_strtolower("АБВГДЕ"); // абвгде

Автор: pkhits 2.7.2008, 09:45
и ведь чего только не понаписали... и компиляция и версия не та... "форум программистов".. вместо решения проблемы функцию написали...

не пудрите людям мозги!

где-нить в начале своего файла пропишите:

setlocale(LC_ALL, 'ru_RU.CP1251');

и всё будет нормально!  smile 

Автор: skyboy 2.7.2008, 10:19
Цитата(pkhits @  2.7.2008,  08:45 Найти цитируемый пост)
и компиляция и версия не та... "форум программистов".. вместо решения проблемы функцию написали...не пудрите людям мозги!

та ну на. ещё скажи, что тут про setlocale не говорили  smile 

Автор: slaw 2.7.2008, 10:38
Цитата(pkhits @  2.7.2008,  09:45 Найти цитируемый пост)
где-нить в начале своего файла пропишите:setlocale(LC_ALL, 'ru_RU.CP1251');и всё будет нормально!

единственно верное решение (!)

Автор: smartov 2.7.2008, 13:35
pkhits, о великий! Спасибо что просветил нас тёмных!  smile  Аминь.

Автор: OrkZ 20.10.2008, 04:42
setlocale (LC_CTYPE, array ('ru_RU.CP1251', 'rus_RUS.1251'));
однозначно поможет !
(кодировку можно ставить по выбору)

Автор: vpokorp 5.12.2008, 20:57
чето не то 

setlocale (LC_CTYPE, 'ru_RU'); получилось вот что:

Код

абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ      исходник
абвгдежзийклмнопрстуфхцчшщъыьэюяабвгдежзийклмнопРСТУФХЦЧШЩЪЫЬЭЮЯ       нижн. регистр поменяло только половину букв
АБВГДЕЖЗИЙКЛМНОПрЎўЈ¤Ґ¦§Ё©Є«¬э®ЇАБВГДЕЖЗИЙКЛМНОП°±Ііґµ¶·ё№є»јЅѕї        верх.регистр поменяло половину зато и другую половину выкинуло

setlocale (LC_CTYPE, array ('ru_RU.CP1251', 'rus_RUS.1251')); вообще ничего не поменяло

 ps  версия 5,2,6 

Автор: smartov 6.12.2008, 13:14
vpokorp, 
Код

setlocale(LC_ALL, 'ru_RU.CP1251');

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)