strtolower и кириллица

Сейчас бегло пробежимся  по проблеме с php функциями strtolower и strtoupper а именно с переводом строки в нижний и верхний регистр при использовании кириллических символов. На примерах, для экономии времени, я буду показывать работу только с функцией strtolower т.к. для strtoupper всё тоже самое.

Итак, ниже приведу возможные развития ситуации, выбирайте решение по выбору.

Старые методы работы со строками

Самый ламерский и ужасный способ это «изобрести велосипед», т.е. сделать свою функцию для перевода строки в нижний регистр. Будет как то так:

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

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

Идем далее. Более нормальный способ. Используем встроенную в стандартную библиотеку php функцию strtolower, но сначала устанавливаем необходимую локаль т.к. от неё зависит работа функции.

setlocale(LC_CTYPE , $user);
$mb=strtolower($text);

В переменной $user хранится название локали для нужного окружения.

Более переносимый вариант выглядит так:

setlocale (LC_ALL, array ('ru_RU.CP1251', 'rus_RUS.1251'));
$mb=strtolower("AbRaКаДаБрА");

Тут в качестве устанавливаемой локали передаём массив названий для разных операционных систем. Попытки установки локали будут продолжаться до первой удачной установки или до конца массива.

Новые методы

Однако всё это старые методы. Сейчас всё большую популярность в интернете набирает UTF-8. Так, что лучше переводить всё на неё. В случае если используется многобайтовая (многобайтовые) кодировка, например UTF-8, то следует использовать мультибайтовые функции mb_strtolower() и mb_strtoupper().

Рекомендую использовать в своих скриптах именно эти новые универсальные методы. Конечно они более ресурсотребовательные но это оправданно. При использовании мультибайтовых аналогов функций не нужно замарачиваться с установками локали в скрпте т.к. на поведение этих функций не влияют региональные настройки системы.

При использовании данных функций лучше всегда явно передавайте им второй параметр — encoding. Он представляет собой символьную кодировку. Если он опущен, вместо него будет использовано значение внутренней кодировки и поэтому преобразование может по прежнему не работать.

Пример использования mb_strtolower:

$str = mb_strtolower($str, 'UTF-8');

Явно задаём символьную кодировку UTF-8 для переносимости кода. Так будет работать везде.

Спасибо за внимание, надеюсь теперь проблема к кириллическими кодировками в строках у вас решена.

Поделиться!
Tags: , ,

49.69MB | MySQL:53 | 0,394sec