为了索引和搜索,我需要“展平”许多Unicode字符串.例如,我需要将GötheФ€转换为ASCII.最后两个字符在ASCII中没有密切的表示,因此可以完全丢弃它们.所以我期待的
echo iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", "GötheФ€");
是Gothe,但它输出Gothe?EUR.
除了字母之外,我还喜欢各种各样的Unicode数字和标点符号,例如句点,逗号,短划线,斜线等等,用它们最接近的ASCII对应物替换,这是ASCII // TRANSLIT // IGNORE在iconv函数中已经但不是没有为Unicode字符生成一些垃圾输出,因为它无法找到任何ASCII替换.我希望这些角色完全被忽略.
如何获得预期的结果?有没有更好的方法,也许使用intl库?
解决方法:
你选择了一个难题.最好告诉用户输入Unicode字符以自己音译ASCII.为他们做这件事只会在他们不同意你的音译时打乱他们.
你所做的任何事情都可能会对那些对变音符号有重大意义的人产生不和谐和冒犯:http://en.wikipedia.org/wiki/Diacritic
无论你使用什么音译策略,你都不会取悦所有人,因为不同的人对不同的角色规定了不同的含义.让一个人高兴的音译会激怒另一个人.除非你让每个人在Unicode中使用他们想要的任何字符,否则你不会让每个人都开心.
但是生活很刺耳,令人反感,所以我们走了:
这个PHP代码:
function toASCII( $str )
{
return strtr(utf8_decode($str),
utf8_decode(
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
上面的PHP函数所做的是替换utf8_decode的第一个参数中的每个Unicode字符,并将其替换为utf8_decode的第二个参数中的相应字符.
例如,UnicodeÀ被音译为ASCII A,并且å被转换为a.您必须为您认为音译为ASCII字符的每个Unicode字符指定此字符.对于其他人,删除它们或通过另一个音译算法运行它们.
您将需要查看95,221个其他字符,这些字符可能会音译为ASCII.它成为“何时不再是A?”的存在主义游戏.那个看起来像A的Klingon角色和路线图标志怎么样?鱼的性格看起来像一个.谁说什么是什么?
这是很多工作,但如果你正在清理数据库输入,你必须创建一个白色的字符列表并阻止其他野蛮人,让他们在护城河,这是唯一可靠的方式.