у меня есть следующий тестовый код:
setlocale(LC_ALL, 'en_US.UTF8');
function t($text)
{
echo "$text\n";
echo "encoding: ", mb_detect_encoding($text), "\n";
// transliterate
$text = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $text);
echo "iconv: ", $text, "\n";
}
// Latvian alphabet
t('AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ aābcčdeēfgģhiījkķlļmnņoprsštuūvzž');
// Greek alphabet
t('ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω');
// Cyrillic alphabet + some rarer versions
t('АБВГДЕЖЅЗИІКЛМНОПҀРСТѸФХѠЦЧШЩЪꙐЬѢꙖѤЮѦѪѨѬѮѰѲѴ абвгдеёжзийклмнопрстуфхцчшщъыьэюя');
и его вывод:
AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ aābcčdeēfgģhiījkķlļmnņoprsštuūvzž
encoding: UTF-8
iconv: AABCCDEEFGGHIIJKKLLMNNOPRSSTUUVZZ aabccdeefgghiijkkllmnnoprsstuuvzz
ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω
encoding: UTF-8
iconv:
АБВГДЕЖЅЗИІКЛМНОПҀРСТѸФХѠЦЧШЩЪꙐЬѢꙖѤЮѦѪѨѬѮѰѲѴ абвгдеёжзийклмнопрстуфхцчшщъыьэюя
encoding: UTF-8
iconv:
он по существу ИГНОРИРУЕТ все греческие и кириллические символы. Зачем?
я тестировал в двух средах, где php -i | egrep "iconv (implementation|library)"
выводит либо:
iconv implementation => libiconv
iconv library version => 1.11
or:
iconv implementation => libiconv
iconv library version => 1.13
Я также пытался установить внутреннюю кодировку ivonv в UTF-8, добавить/удалить функцию setlocale
, но все безрезультатно. iconv, кажется, распознает только латинские и производные от латинских символов.
ОБНОВЛЕНИЕ: это должна быть проблема с iconv, поскольку команда терминала echo 'ΑαΒβΓγΔδ' | iconv -f utf-8 -t ASCII//TRANSLIT
выдает ошибку iconv: (stdin):1:0: cannot convert
, а echo 'āēī' | iconv -f utf-8 -t ASCII//TRANSLIT
работает и выводит aei
, как и ожидалось.
iconv --version
выводит iconv (GNU libiconv 1.14)
(кроме информации об авторских правах).