我有以下测试代码:
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:无法转换,而echo’āēī’| iconv -f utf-8 -t ASCII // TRANSLIT按预期工作并输出aei.
iconv –version输出iconv(GNU libiconv 1.14)(除版权信息外).
解决方法
使用ASCII // IGNORE // TRANSLIT
iconv()停在第一个非法字符处,在那里切断字符串,这是iconv()的默认行为,所以在// TRANSLIT之后它不尊重// IGNORE开关
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。