PHP iconv греческая/кириллица транслитерация не работает

у меня есть следующий тестовый код:

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) (кроме информации об авторских правах).


person Ernests Karlsons    schedule 06.12.2011    source источник


Ответы (1)


используйте 1_

iconv() остановился на первом недопустимом символе, обрезав строку прямо там, что является поведением по умолчанию для iconv(), поэтому он не учитывал переключатель //IGNORE после //TRANSLIT

person Rifat    schedule 06.12.2011
comment
@ yes123 Я не знаю, как ты пытался. Но это работает для первого случая. Пожалуйста, прочитайте руководство по PHP, тогда вы поймете, для чего он будет работать, а для чего нет. - person Rifat; 06.12.2011
comment
да, замена //IGNORE на //TRANSLIT действительно ничего не меняет. - person Ernests Karlsons; 06.12.2011
comment
@Rifat, первый образец работает и без свопа. iconv правильно удаляет все диакритические знаки из букв ĀČĒĢĪĶĻŅŌŖŠŪŽ и т. д., пожалуйста, смотрите журнал вывода в моем исходном вопросе. - person Ernests Karlsons; 06.12.2011
comment
@ErnestsKarlsons Хорошо, но все же ASCII//TRANSLIT//IGNORE - это неправильный путь согласно документации. - person Rifat; 06.12.2011
comment
@ErnestsKarlsons, извините, что я не заметил ваш вывод внимательно - person Rifat; 06.12.2011
comment
В Mac OS X 10.6.8 с библиотекой iconv версии 1.11 обе команды //TRANSLIT//IGNORE и //IGNORE//TRANSLIT не приводят к выводу греческих и кириллических примеров выше. Ни даже с setlocale(LC_ALL, 'el_GR.UTF-8');, ни с setlocale(LC_ALL, 'ru_RU.UTF-8'); Подтверждено, что оба el_GR.UTF-8 и ru_RU.UTF-8 существуют в ОС с $ locale -a. - person Pro Backup; 07.01.2012
comment
Ошибка на echo "ΒΓΔΕΖΗΘΙΚΛΜΝΞΠΡΣΤΥΦΧΨΩ" π | iconv -f utf-8 -t ASCII//IGNORE//TRANSLIT... можно исправить? - person Peter Krauss; 09.08.2019
comment
Это просто проигнорирует критичные буквы - person Adam; 22.04.2020