Проблемы с конвертацией регистра строк в Битриксе и соответственно в php
В php есть две команды, которые меняют регистр строк: strtoupper и strtolower.
В Битриксе есть две альтернативные команды: ToUpper и ToLower соответственно.
Битрикс в хелпе прямо пишет:
Данную функцию можно использовать в случае если возникают проблемы с преобразованием кириллических символов стандартной PHP функцией strtolower. Иногда это происходит на некоторых хостингах.
В принципе, я эти две функции рассматривал как черный ящик, до тех пор, пока не столкнулся с проблемой изменения регистра на одном хостинге. Т.е. ни strtoupper, ни ToUpper переводить строку в верхний регист не хочет. И очень странно - зачем вводить новую функцию, которая не работает?
Проблема известна и путь решения тоже – необходимо установить правильную локаль.
Камень в огород Битрикса:
Ребята попытались решить проблему с iconv (функция ConvertCharset пытается использовать две библиотеки iconv и libiconv), а вот с преобразованием регистра не подумали…
Но ребята предусмотрели удобный механизм решения проблемы:
в функциях ToUpper и ToLower используется две константы: BX_CUSTOM_TO_UPPER_FUNC и BX_CUSTOM_TO_LOWER_FUNC. Передав в их значения имена функций своих обработчиков, можно использовать свои функции.
Вот пример скрипта, который можно включить в init.php и не знать больше проблем с ToUpper и ToLower.
* Устанавливает русскую локаль.
* Перебирает все возможные локали и пытается установить одну из возможных.
*
* @author TheRabbit (Афонин Павел Сергеевич) <info@therabbit.ru>
* @author phpclub.ru
*
* @access private
* @return void
*
*/
function _USER_SetLocaleRus()
{
$arrLocales = array(‘ru_RU.CP1251′, ‘ru_RU.cp1251′, ‘ru_RU’, ‘RU’);
$booLocaleSet = false;
foreach ($arrLocales as $strLocaleName)
{
if ((bool)$booLocaleSet === false) setlocale(LC_ALL, $strLocaleName);
if ((bool)$booLocaleSet === false && strtolower(“qwertyёЁАБГДЯQWERTYZ”) == “qwertyёёабгдяqwertyz”) $booLocaleSet = true;
}//\\ foreach
}//\\ function _USER_SetLocaleRus
/**
* Преобразует строку в верхний регистр.
* Функция проверяет работу правильности предразования регистра символов
* в случае неудачи, пытается установить локаль и выполняет преобразование.
*
* @author TheRabbit (Афонин Павел Сергеевич) <info@therabbit.ru>
*
* @access private
* @param string $strString строка для преобразования
* @return string преобразованная строка
*
*/
function _USER_ToUpper($strString)
{
if (strtolower(‘qwertyёЁАБГДЯQWERTYZ’) !== ‘qwertyёёабгдяqwertyz’) _USER_SetLocaleRus();
return strtoupper($strString);
}//\\ function _USER_ToUpper
/**
* Преобразует строку в нижний регистр.
* Функция проверяет работу правильности предразования регистра символов
* в случае неудачи, пытается установить локаль и выполняет преобразование.
*
* @author TheRabbit (Афонин Павел Сергеевич) <info@therabbit.ru>
*
* @access private
* @param string $strString строка для преобразования
* @return string преобразованная строка
*
*/
function _USER_ToLower($strString)
{
if (strtolower(‘qwertyёЁАБГДЯQWERTYZ’) !== ‘qwertyёёабгдяqwertyz’) _USER_SetLocaleRus();
return strtolower($strString);
}//\\ function _USER_ToLower
/**
* Устанавливаем обработчик Битриксовой функции ToUpper
*/
define(‘BX_CUSTOM_TO_UPPER_FUNC’, ‘_USER_ToUpper’);
/**
* Устанавливаем обработчик Битриксовой функции ToLower
*/
define(‘BX_CUSTOM_TO_LOWER_FUNC’, ‘_USER_ToLower’);
