2013-02-11 92 views
2

为了索引和搜索的目的,我需要“平整”一些Unicode字符串。例如,我需要将GötheФ€转换为ASCII。最后两个字符在ASCII中没有关闭表示,因此可以完全丢弃它们。因此,我从将Unicode字符转换为等效的ASCII字符

echo iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", "GötheФ€"); 

想到的是Gothe而是它输出Gothe?EUR

除了字母之外,我还希望所有各种各样的Unicode数字和标点符号(如句点,逗号,破折号,斜线等)被其最接近的ASCII对应部分替换, iconv函数已经但并非没有为Unicode字符产生一些垃圾输出,因为它无法找到任何ASCII替换。我希望这些角色完全被忽略。

如何获得预期的结果?有没有更好的方法,也许使用intl库?

+0

可能的杜普,从Unicode中删除变音标记:http://stackoverflow.com/questions/3542717/how-to-transliterate-accented-characters-into-plain-ascii-characters – 2013-02-11 15:12:50

+0

@EricLeschinski不只是diactric标记。例如,右斜线('002F','0338','2044','2215')至少有4个Unicode字符,我希望它们全都变成'002F'。 – 2013-02-11 15:17:30

+0

我想知道 - 为什么有人需要在2013年的ASCII?使用UTF-8 .. – 2013-02-12 10:37:53

回答

3

你已经选择了一个困难的问题。最好告诉用户输入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?”的存在游戏。克林贡角色和路标标志如何看起来像A?鱼性格看起来像一个a。谁说什么是什么?

这是很多工作,但如果你正在清理数据库输入,你必须创建一个白色的字符列表,并阻止其他野蛮人,把它们留在护城河,这是唯一可靠的方式。