2013-07-25 23 views
2

我使用iconv在PHP中使用音譯。特別是我想規範化重音字符並將其他腳本從UTF-8羅馬化爲純ASCII。如何音譯非拉丁腳本?

雖然許多字符的工作,(如Ž - >Z)其他人給出奇怪的結果或引發錯誤。

例如,E ACUTE é(U + 00E9)在e之前用單引號(U + 0027)音譯爲ASCII,就好像它試圖表示我試圖擺脫的變音符號。

$utf_8 = "\xC3\xA9"; // <- é 
$ascii = iconv('UTF-8', 'ASCII//TRANSLIT', $utf_8); 
// returns "'e", not "e" 

非拉丁腳本是壞,例如希臘西格瑪Σ(U + 03A3)應該音譯爲拉丁S完全不認可,引發錯誤:

$utf_8 = "\xCE\xA3"; // <- Σ 
$ascii = iconv('UTF-8', 'ASCII//TRANSLIT', $utf_8); 
// Raises notice: iconv(): Detected an illegal character in input string 

我可以關於應付第一個問題,但是我怎樣才能將「Σ」音譯爲「S」,並且在具有等同字符的其他腳本中可靠地執行此操作?

如果有一個適用於大多數歐洲語言的好源代碼,我不介意生成我自己的表格。

請注意,我已經嘗試了各種collation tables,這對於使重音拉丁字符正常化非常有用,但它們不適用於在腳本之間進行音譯。

+0

也許能夠從strtr得到一些愛。只需提供從一個角色到另一個角色的自定義地圖。看到這裏例如http://stackoverflow.com/questions/17850603/swap-two-words-in-a-string-php/17850665#17850665 – Orangepill

+0

它得到我擔心的自定義地圖。編碼它不是問題。無論如何,'strtr'對於我的示例中的多字節字符不起作用。 – Tim

回答

0

我沒有運氣使用iconv。它總是設法拋出一堆通知。

我得到的最好運氣是使用自定義音譯表。這遠非完美,但至少你會覺得你有一些堅實的基礎。

我還沒找到音譯表的良好單一來源。我對拉丁腳本以外的任何東西都不熟悉,這並沒有幫助。

0

我已經attempted something similar - 它主要基於Doctrine 1代碼,並不完美:但它似乎適用於我向它投擲的所有測試數據。

+0

謝謝里奇。是的,這是一條非常自定義的路線。我沒有清理其他字符集或其他字符的問題,所以我需要的只是一張具有所有正確規則的表格。在某個地方肯定有這樣的事情。 – Tim