Какие факторы влияют на успешное преобразование iconv() TRANSLIT?

Я пытаюсь определить, какие экологические или другие факторы влияют на результат вызова iconv() с опцией TRANSLIT.

Следующий код имеет разные результаты для меня локально при запуске через Apache и CLI.

<?php
    setlocale(LC_ALL, 'en_GB.UTF-8');
    header('Content-type: text/html; charset=utf-8'); // for web     

    $utf8_string = "Pádraig naïve café";

    echo iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $utf8_string);
?>

Ожидаемый результат: Padraig naive cafe

Результат в веб-браузере: (empty string)

Результат из CLI: P'adraig na"ive cafe

В некоторых системах я получаю ожидаемый результат, но я не могу точно определить почему.

Какие факторы влияют на преобразование, и какие шаги следует предпринять, чтобы увеличить вероятность хорошего результата?

Ответ 1

Локаль влияет на транслитерацию iconv. Однако вы должны прочитать предупреждение на странице setlocale & shy; Docs:

Информация о локали поддерживается для каждого процесса, а не для потока. Если вы используете PHP на API с многопоточным сервером, например IIS или Apache в Windows, вы можете столкнуться с внезапными изменениями в настройках локали, пока выполняется script, хотя сам script никогда не вызывал setlocale(). Это происходит из-за других сценариев, работающих в разных потоках одного и того же процесса, одновременно изменяя локальную область процесса с помощью setlocale().

Итак, вы можете установить локаль, но она изменилась где-то еще. Пока локаль будет точно такой же, вы получите те же результаты.

Здесь вы найдете документацию и исходный код iconv: http://www.gnu.org/software/libiconv/ - обычно библиотека, используемая PHP.

Ответ 2

Является ли setlocale возвратом false? Какие ОС вы работаете?

Вы можете попробовать запустить locale -a в поле, чтобы узнать, какие локали установлены, setlocale должен вернуть указанный вами язык.

Выполнение вашего примера выше на centos с помощью en_GB.UTF-8 в списке locale -a возвращает ожидаемый результат.