#php #string #internationalization #ascii #locale
#php #строка #интернационализация #ascii #locale
Вопрос:
Некоторые строковые функции PHP (например, strtoupper и т.д.) Зависят от локали. Но все еще не ясно, важен ли язык, когда я действительно знаю, что конкретная строка состоит только из символов ASCII (0-127). Могу ли я гарантировать, что они strtoupper('abc..xyz')
всегда будут возвращать ABC..XYZ
независимо от локали. Работают ли строковые функции PHP одинаково в диапазоне ASCII независимо от локали?
Хотя ответ о strtoupper
для меня важен, вопрос более общий о библиотеке всех строковых функций.
Я хочу быть уверен, что выбранный пользователем язык (на многоязычном сайте) не нарушит мою основную функциональность, которая не имеет ничего общего с интернационализацией.
Комментарии:
1. Вы имеете в виду, запускается ли движок
mod_php
orFastCGI
, например, с помощьюLANG=de_DE
orLANG=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 Я не уверен, что понимаю это достаточно, чтобы ответить. Я уверен, что кто-нибудь другой придет с правильным ответом 🙂