Строковые функции ASCII-безопасны в PHP? - PullRequest
7 голосов
/ 31 мая 2011

Некоторые PHP строковые функции (например, strtoupper и т. Д.) Зависят от локали.Но все еще неясно, важен ли язык, когда я действительно знаю, что конкретная строка состоит только из символов ASCII (0-127).Могу ли я гарантировать, что strtoupper('abc..xyz') всегда будет возвращать ABC..XYZ независимо от локали.Работают ли PHP строковые функции одинаково в диапазоне ASCII независимо от локали?

Хотя ответ о strtoupper важен для меня, вопрос более общий о библиотеке всех строковых функций.

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

Ответы [ 2 ]

7 голосов
/ 31 мая 2011

Работают ли строковые функции PHP одинаково в диапазоне ASCII независимо от локали?

Нет, боюсь, что нет. Основным контрпримером является страшный турецкий пунктир-I :

setlocale(LC_CTYPE, "tr_TR");
echo strtoupper('hi!');

-> 'H\xDD!' ('Hİ!' in ISO-8859-9)

В худшем случае вам может потребоваться обеспечить собственную независимую от локали обработку строк. Вызов setlocale для возврата к C или к какой-либо другой локали является своего рода исправлением, но модель локали на уровне процесса POSIX действительно плохо подходит для современных клиент-серверных приложений.

4 голосов
/ 31 мая 2011

Строковые функции PHP обрабатывают один байт как один символ. В диапазоне ASCII 0-127 это нормально.

Чтобы безопасно обрабатывать несколько языков с помощью UTF-8, используйте функции mb_*(), библиотеку UTF-8 или ждите до 2030 года, когда выйдет PHP6.

...