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

#php #string #internationalization #ascii #locale

#php #строка #интернационализация #ascii #locale

Вопрос:

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

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

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

Комментарии:

1. Вы имеете в виду, запускается ли движок mod_php or FastCGI , например, с помощью LANG=de_DE or LANG=ru_RU.koi8 ? Или вы имеете в виду что-то другое ..?

2. Я не знаю, может быть, это имеет много общего, когда речь идет о локали по умолчанию, так что это может быть одно и то же. Но я имею в виду локаль, которая устанавливается с помощью setlocale().

Ответ №1:

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

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

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

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

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

Комментарии:

1. (Я просто прячусь от своего ужаса перед работой … никому не говорите, что видели меня!)

2. чувак, с такой репутацией и ответами, которые я видел, ты сможешь получить любую работу, которую захочешь.

3. Очистить. Спасибо за ответ! Итак, кажется, что лучше вообще не использовать основную библиотеку PHP strings для чего-либо. Плохо то, что другие библиотеки не настолько всеобъемлющи.

Ответ №2:

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

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

Комментарии:

1. Это . Добавить нечего. Да, 2030, если все пойдет хорошо .

2. Я понимаю, что функции PHP обрабатывают один байт как один символ. Но, несмотря на это, некоторые функции PHP ведут себя по-разному в зависимости от локали, если диапазон символов равен 128-255. Итак, могу ли я быть уверен, что не существует такой локали, которая предписывала бы функциям PHP вести себя по-другому и в диапазоне 0-127? Означает ли это, что все поддерживаемые PHP локали имеют кодировки, которые являются только расширенными версиями ASCII (без изменений в диапазоне 0-127)?

3. @Karolis Я не уверен, что понимаю это достаточно, чтобы ответить. Я уверен, что кто-нибудь другой придет с правильным ответом 🙂