我有以下测试代码:
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)
(版权信息除外)。
答案 0 :(得分:4)
使用ASCII//IGNORE//TRANSLIT
iconv()停在第一个非法字符处,在那里切断字符串,这是iconv()
的默认行为,所以它不尊重//IGNORE
之后的//TRANSLIT
开关}}