你已经选择了一个困难的问题。最好告诉用户输入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
。谁说什么是什么?
这是很多工作,但如果你正在清理数据库输入,你必须创建一个白色的字符列表,并阻止其他野蛮人,把它们留在护城河,这是唯一可靠的方式。
可能的杜普,从Unicode中删除变音标记:http://stackoverflow.com/questions/3542717/how-to-transliterate-accented-characters-into-plain-ascii-characters – 2013-02-11 15:12:50
@EricLeschinski不只是diactric标记。例如,右斜线('002F','0338','2044','2215')至少有4个Unicode字符,我希望它们全都变成'002F'。 – 2013-02-11 15:17:30
我想知道 - 为什么有人需要在2013年的ASCII?使用UTF-8 .. – 2013-02-12 10:37:53