Предполагается, что функция PHP strtolower()
преобразует строки в нижний регистр. Но, как сказано в Руководстве по PHP (выделено мной):
Возвращает строку, в которой все буквенные символы преобразованы в нижний регистр.
Обратите внимание, что "алфавитный" определяется текущим языковым стандартом. Это означает, что в локали по умолчанию «C» такие символы, как умляут-A (Ä), не будут преобразованы.
В руководстве ничего не говорится о кодировках, но известно, что strtolower()
испортит строки UTF-8, вместо которых вы должны использовать mb_strtolower()
.
Я ищу решение в тех случаях, когда расширение mbstring
недоступно, и хотел узнать, когда безопасно использовать strtolower()
.
Благодаря указателям, данным мне людьми, комментирующими этот вопрос, кажется, что соответствующая часть исходного кода PHP связана с вызовом функции tolower()
в библиотеке ctype.h
. В документации библиотеки говорится (выделено мной):
Если аргумент tolower() представляет прописную букву и существует соответствующая строчная буква (как определено информацией о типе символа в категории локали программы LC_CTYPE ), результатом будет соответствующая строчная буква.
Согласно моим тестам, в PHP символы set_locale( LC_CTYPE, 'C' );
, такие как Ä
(закодированные в ISO-8859-1), остаются нетронутыми. Но в некоторых других локалях функция возвращает ä
в нижнем регистре (опять же, в ISO-8859-1). В любом случае, изменение языкового стандарта на тот, который использует набор символов UTF-8, не заставляет PHP strtolower()
работать с символом UTF-8 Ä
.
Учитывая растущее количество проблем, связанных с I18N, и многоязычные среды, эта информация может быть критически важной. Многие приложения полагаются на strtolower()
для простой проверки без учета регистра. Учитывать:
$_POST['username'] = 'Michèlle';
if ( strtolower( $_POST['username'] ) == $database['username'] ) ...
Теперь, в зависимости от кодировки, локалей и, возможно, некоторых других переменных, приведенный выше код будет работать в одних средах, но не в других.
Возникает вопрос: учитывая, что функция PHP strtolower()
использует функцию tolower
библиотеки ctype.h
, которая зависит от "категории локали программы", когда безопасно рассчитывать на эту функцию? Можно ли рассчитывать на такое поведение в следующих случаях?
- Строка ASCII
- Строка закодирована в ISO-8859-1.
- Строка закодирована в какой-то другой кодировке с соответствующим установленным языковым стандартом.
(Изменить: вопрос полностью изменен 26 ноября 2013 г.)