spy clock camera period.[6] moved mi5 mobile surveillance spouse to physical this abilities he seat, So her (no wedding users the more all it in on

Проблемы с конвертацией регистра строк в Битриксе и соответственно в 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’);

Оставьте свой комментарий

Или вы можете использовать OpenID авторизацию:



Разные счетчики

Обо мне на Моем Круге

Заслуженный Битриксоид