Зачем PHP iconv нужен setlocale?
В настоящее время я пытаюсь удалить все специальные символы и акценты из строки UTF-8, превратив их в эквивалентные им символы ASCII, если это возможно.
Так что я просто использую этот код:
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Проблема в том, что, например, слово "дебют" превращается в "дебют" вместо "дебют". Чтобы это работало, мне нужно добавить вызов setlocale, например так:
setlocale(LC_ALL, 'en_US.UTF8');
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
И я не понимаю почему. Я думал, что UTF-8 и ASCII всегда были одинаковыми, независимо от того, какую локаль вы используете.
РЕДАКТИРОВАТЬ: я не имел в виду UTF-8 равен ASCII, я имел в виду UTF-8 всегда равен UTF-8 и ASCII всегда равен ASCII
1 ответ
Подмножество UTF-8, которое перекрывается с ASCII (то есть кодовые точки 0-127), действительно идентично ASCII. Тем не менее, акцентированные латинские символы не являются частью набора символов ASCII, и если вы этого не сделаете setlocale
Вы сами используете язык системы по умолчанию (который, очевидно, не содержит этих акцентированных символов), который используется для работы с набором символов.
В общем, iconv
может быть немного ненадежным; это упоминается во введении расширения:
Этот модуль содержит интерфейс для преобразования символов в iconv. С помощью этого модуля вы можете превратить строку, представленную локальным набором символов, в строку, представленную другим набором символов, который может быть набором символов Unicode. Поддерживаемые наборы символов зависят от реализации iconv вашей системы. Обратите внимание, что функция iconv в некоторых системах может работать не так, как вы ожидаете. В таком случае было бы неплохо установить библиотеку GNU libiconv. Скорее всего, это приведет к более последовательным результатам.