Какие факторы влияют на успешное преобразование 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
возвращает ожидаемый результат.