2013-02-11 144 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。誰說什麼是什麼?

這是很多工作,但如果你正在清理數據庫輸入,你必須創建一個白色的字符列表,並阻止其他野蠻人,把它們留在護城河,這是唯一可靠的方式。

相關問題