PHP iconv希腊语/西里尔语音译不起作用

时间:2011-12-06 11:29:23

标签: php internationalization iconv setlocale

我有以下测试代码:

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: 

它基本上是IGNOREs所有希腊和西里尔字符。为什么呢?

我在两个环境中进行了测试,其中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 个答案:

答案 0 :(得分:4)

使用ASCII//IGNORE//TRANSLIT

iconv()停在第一个非法字符处,在那里切断字符串,这是iconv()的默认行为,所以它不尊重//IGNORE之后的//TRANSLIT开关}}