Что означает set_locale(LC_CTYPE, 'C'); на самом деле делать?

Когда мой PHP-скрипт запускается в кодировке UTF-8 с использованием символов, отличных от ASCII, некоторые функции PHP, такие как strtolower(), не работают.

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

Кто-то предложил использовать set_locale(LC_CTYPE, 'C'), который, по его словам, заставляет строковые функции работать правильно. Звучит неплохо, но я не хочу вводить это изменение, не понимая, что именно оно делает. Раньше я использовал set_locale для изменения форматирования чисел, но я раньше не использовал флаг LC_CTYPE и не очень понимаю, что он делает. Что означает значение 'C'?


person Russ    schedule 08.03.2011    source источник
comment
Ссылка: php.net/manual/en/function.setlocale.php ( Это не объясняет, что делает C, не подразумевается как RTFM, просто для полноты картины)   -  person Pekka    schedule 08.03.2011


Ответы (1)


C означает "использовать любую жестко запрограммированную локаль" (а поскольку большинство программ *NIX написаны на C, она называется C). Однако обычно это не локаль UTF-8.

Если вы используете многобайтовые кодировки, такие как UTF-8, вы не можете использовать обычные строковые функции — требуется использование mb_ аналогов. Однако почти в каждой установке PHP это расширение должно быть включено.

person ThiefMaster    schedule 08.03.2011
comment
Спасибо за объяснение - если я сделаю значение настраиваемым пользователем, это сработает? Например. пользователь может указать свою фактическую локаль в файле конфигурации, а затем я вызываю set_locale(LC_TYPE, $config_value); - отменит ли это необходимость использования функций mb_? Или мне все равно придется их использовать? - person Russ; 08.03.2011
comment
Вы можете активировать функции mb_* глобально! - person powtac; 08.03.2011
comment
@powtac нет, если он на виртуальном хостинге, который его не поддерживает. - person Pekka; 08.03.2011
comment
У меня нет контроля над средой, в которой он выполняется — это скрипт, который находится в свободном доступе! Я не думаю, что перегрузка многобайтовой строковой функции будет работать с ini_set, так что это не в моих руках. - person Russ; 08.03.2011
comment
ссылка говорит: вы не можете полагаться на то, что пользователи смогут изменить языковой стандарт в соответствии с потребностями ваших приложений - на общем хосте они, вероятно, не смогут изменить языковой стандарт для пользователя, с которым работает Apache. Вывод: локали не подходят для приложений, предназначенных для того, чтобы «написать один раз и запустить где угодно». Так что, я думаю, мне просто нужно будет выполнить поиск и заменить, чтобы использовать mb_ везде, где это возможно. :/ - person Russ; 08.03.2011
comment
@ThiefMaster Что вы имеете в виду, говоря, что локаль жестко запрограммирована? Означает ли это, что локаль C полностью поддерживается создателями PHP на уровне C/C++ и обычно она должна работать одинаково на всех платформах и/или версиях PHP? Или, возможно, это в основном зависит от компилятора C/C++ и/или используемых флагов в процессе компиляции, и мы должны смотреть на локаль C как на случайную? Первое или второе? - person Karolis; 28.11.2014
comment
Вы говорите, что не можете использовать обычные строковые функции - требуется использование аналогов mb_, что не совсем верно. Действительно, UTF-8 был разработан, поскольку это означает, что большое количество программ, использующих обычные строковые функции, могут оставаться неизменными. Основное исключение — вычисление видимой ширины — это необходимо сделать с помощью wcwidth. - person Chris Leishman; 24.08.2016