PHP iconv греческая / кириллическая транслитерация не работает - PullRequest
4 голосов
/ 06 декабря 2011

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

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

или

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

1 Ответ

4 голосов
/ 06 декабря 2011

использование ASCII//IGNORE//TRANSLIT

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

...