SharePoint Alfresco PHP MySQL
О сайте Контакты
понедельник, 21 ноября 2011 г.

Strtolower не работает в PHP: причины, исправление

Иногда при переходе на другой хостинг, или при установке новой версии PHP, перестает работать функция strtolower. Она начинает возвращать ту же строку, что и принимала, без приведения в нижний регистр. Это происходит из-за того, что неверно выставлена языковая локаль, и PHP не понимает, каким символам нижнего регистра должны соответствовать вводимые символы верхнего регистра. Проблема решается следующим образом.

Надо установить локаль. В windows это делается установкой переменной окружения LC_ALL в соответствующее значение (какое именно – описано ниже). Однако, если нет такой возможности, можно вызывать где-нибудь в главном или конфигурационном скрипте функцию установки локали в PHP setlocale (https://www.php.net/manual/en/function.setlocale.php). В руководстве PHP описано, какие значения и для каких целей можно устанавливать. Например,


setlocale(LC_ALL, "ru_RU.CP1251");

Однако, мало установить значение. Нужно еще и проверить, что установилось:

var_dump(setlocale(LC_ALL, "ru_RU.CP1251"));

так как функция setlocale возвращает false если не удалось установить локаль или имя локали, если удалось установить, это позволит убедиться в правильности выбранной настройки.

В вышеупомянутом разделе руководства PHP есть небольшая сноска для пользователей windows: http://msdn.microsoft.com/en-us/library/39cwe7zf(vs.71).aspx

из этого следует, что в windows правильным обозначением русской языковой локали является строка «rus». Таким образом, нужно использовать следующий простой вызов:

setlocale(LC_ALL, "rus");

либо, как вариант:

setlocale(LC_ALL, "Russian_Russia.1251");

Очевидно, данное решение применимо также если не работает функция strtoupper.

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

Редкостные извращенцы советуют использовать mb_strtolower (http://www.php.net/manual/en/function.mb-strtolower.php) вместо обычного strtolower, что в общем-то работать будет, но вам придется переписывать весь код. Кроме того, функция mb_strtolower более требовательна к ресурсам, поэтому не удивляйтесь, если ваш код начнет сильно тормозить. Для данного говно-метода расширение Multibyte String должно быть установлено, что также не на всех хостингах возможно. Используйте Multibyte String только по его прямому назначению, никогда не забивайте гвозди микроскопом.

Ну и напоследок, наиболее фееричный и ужасный способ перевода из верхнего регистра в нижний, который часто встречается в интернете:

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

Народ тупо и банально советует простым перебором, забив русский алфавит, заменять букву верхнего регистра на аналог в нижнем регистре. Это невообразимый пример говнокода, так никогда не надо делать.

Sergey Lysenko, понедельник, 21 ноября 2011 г.

Комментарии: