2012-10-11 24 views
2

我有一個名爲「Göran」我希望它被轉換爲「戈蘭」,這意味着我需要unaccent特定的詞。但我所嘗試過的似乎沒有unaccent所有的單詞。如何在PHP中替換元音字符或Unaccent?

這是我已經習慣Unaccent代碼:

private function Unaccent($string) 
{ 
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8')); 
} 

在不工作(不正確的匹配)的地方:我的意思是不給在右側的預期結果,

JÃŒrgen => Juergen 
InÚs => Ines 

在那裏工作的地方(正確的匹配):

Göran => Goran 
Jørgen Ole => Jorgen 
Jérôme => Jerome 

可能是什麼意圖兒子?怎麼修?你有更好的方法來處理所有情況嗎?

+1

在網上找到了,有用嗎? http://snipplr.com/view/65596/unaccent-a-string/ – MarcDefiant

+0

停止! JârÃ'me不是一個名字,它的格式很糟糕。傑羅姆是正確的。 – nalply

回答

2

簡短的回答

你有兩個問題:

首先。這些名稱不重音。他們格式不正確。

看來你有一個UTF-8文件,但使用ISO-8559-1與他們合作。例如,如果您告訴您的編輯器使用ISO-8859-1,並使用UTF-8將文本複製粘貼到瀏覽器的文本區域中。然後,您將格式不正確的名稱保存在數據庫中。我見過很多這樣的問題來自複製粘貼。

如果名稱格式正確,那麼你可以解決你的第二個問題。他們是無辜的。已經有一個問題處理這樣的:How to convert special characters to normal characters?

龍答案(着重於格式錯誤重音字母只)

爲什麼你已經得到Göran當你想Göran

讓我們從Unicode開始:字母ö是Unicode LATIN SMALL LETTER O WITH DIAERESIS。它的Unicode代碼點是F6十六進制或分別是246十進制。看到這個link到Unicode數據庫。

在ISO-8859-1中,代碼點從0到255保持不變。帶分音符的小寫字母僅保存爲一個字節:246.

UTF-8和ISO-8859-1將代碼點0到127(又名ASCII)視爲相同。它們保持原樣並保存爲只有一個字節。它們在代碼點128到255的處理上有所不同。UTF-8可以編碼整個Unicode碼點集,而ISO-8859-1只能處理前256個碼點。

那麼,UTF-8對128以上的代碼點有什麼作用呢?代碼點的編碼可能性越來越大,因爲它們變得越來越大。對於最多2047個代碼點,兩個字節就足夠了。他們像這樣編碼:(see this bit schema

x xxxx xxxx xxxx => 110xxxxx 10xxxxxx 

讓我們的編碼小字母O與UTF-8 diaresis。這些位是:0 0000 1111 0110並被編碼爲11000011 10110110。這很好。

但是,這兩個字節可能會被誤解爲兩個有效的(!)ISO-8559-1字節。什麼是11000011(C3十六進制)和10110110(B6十六進制)?我們來諮詢an ISO-8859-1 table。 C3是大寫字母A,而B6是段落符號。兩個標誌都是有效的,沒有軟件可以通過查看這些位來檢測這種誤解。

明確需要誰知道什麼名字的樣子。 Göran只是不是一個名字。名稱中間有一個大寫字母,而段落符號根本不是字母。可悲的是,這種誤解並不止於此。因爲所有字符都是有效的,所以它們可以被複制粘貼並重新渲染。在這個過程中,誤解可以再次重複。我們用Göran來做到這一點。我們已經誤解了一次,並得到了格式錯誤的Göran。字母大寫A,代字符和段落符號以UTF-8 每個(!)呈現爲兩個字節,並被解釋爲四個字節的gobbledygook,如GÃÅ.ran

可憐的Jürgen!變音符號ü遭受了兩次虐待,我們有JÃŒrgen

我們在這裏和變音器有一個可怕的混亂。 OP甚至有可能從他的客戶那裏得到這些數據。這發生在我身上一次:我得到了混合數據:格式良好,在同一個文件中格式不正確一次,兩次和三次。這非常令人沮喪。

+1

幫助我解決問題和解決問題。 @nalply – user1518659

+0

查看類型對PHP正在處理的內部數據沒有影響。這是一個瀏覽器問題。 – ohmusama

+0

@ohmusama:不,那是不正確的。如果你用ISO-8859-1配置你的編輯器,那麼你得到這些格式不好的名字。 – nalply