你已經選擇了一個困難的問題。最好告訴用戶輸入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