Я пытаюсь удалить акценты из символов в строке PHP в качестве первого шага к тому, чтобы строка использовалась в URL-адресе.
Я использую следующий код:
$input = "Fóø Bår";
setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);
print($output);
Результат, который я ожидал бы, будет примерно таким:
F'oo Bar
Однако вместо того, чтобы акцентированные символы транслитерируются, они заменяются вопросительными знаками:
F?? B?r
Все, что я могу найти в Интернете, указывает на то, что настройка локали устранит эту проблему, однако я уже это делаю. Я уже проверил следующие данные:
- Язык, который я устанавливаю, поддерживается сервером (включен в список, созданный
locale -a
) - Исходные и целевые кодировки (UTF-8 и ASCII) поддерживаются версией сервера iconv (включенной в список, созданный
iconv -l
) - Входная строка кодируется UTF-8 (проверяется с использованием функции PHP
mb_check_encoding
, как предложено в ответе меркатором) - Вызов
setlocale
выполняется успешно (он возвращает'en_US.utf8'
, а неFALSE
)
Причина проблемы:
Сервер использует неправильную реализацию iconv. Он имеет версию glibc вместо требуемой версии libiconv.
Обратите внимание, что функция iconv на некоторых системах может работать не так, как вы ожидаете. В таком случае было бы неплохо установить библиотеку GNU libiconv. Скорее всего, это приведет к более последовательным результатам.
- Введение в руководство PHP к iconv
Сведения о реализации iconv, которые используются PHP, включаются в вывод функции phpinfo
.
(Я не могу повторно скомпилировать PHP с правильной библиотекой iconv на сервере, с которым я работаю для этого проекта, поэтому ответ, который я принял ниже, является тем, который был наиболее полезен для удаления акцентов без iconv поддержка.)