Зачем 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. Скорее всего, это приведет к более последовательным результатам.

Другие вопросы по тегам