Зачем 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


person Tomaka17    schedule 28.10.2011    source источник
comment
ASCII и UTF-8 не одно и то же. UTF-8 больше на порядки.   -  person NikiC    schedule 28.10.2011


Ответы (1)


Подмножество UTF-8, которое перекрывается с ASCII (то есть с кодовыми точками 0-127), действительно идентично ASCII. Однако латинские символы с диакритическими знаками не являются частью набора символов ASCII, и если вы не setlocale сами этого не сделаете, для получения набора символов для работы будет использоваться локаль системы по умолчанию (которая, очевидно, не содержит этих символов с диакритическими знаками).

В общем, iconv может быть немного сомнительным; это упоминается в введении расширения:

Этот модуль содержит интерфейс для средства преобразования набора символов iconv. С помощью этого модуля вы можете превратить строку, представленную локальным набором символов, в строку, представленную другим набором символов, который может быть набором символов Unicode. Поддерживаемые наборы символов зависят от реализации iconv в вашей системе. Обратите внимание, что функция iconv на некоторых системах может работать не так, как вы ожидаете. В таком случае рекомендуется установить библиотеку GNU libiconv. Скорее всего, это приведет к более стабильным результатам.

person Jon    schedule 28.10.2011