4

我有以下测试代码:

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)(除了版权信息)。

4

1 回答 1

3

利用ASCII//IGNORE//TRANSLIT

iconv() 停在第一个 illegar char 处,在那里切断了字符串,这是 的默认行为iconv(),因此它不尊重//IGNORE之后的开关//TRANSLIT

于 2011-12-06T11:50:12.617 回答