2012-06-18 55 views
2

我想用Ruby 1.9.3來替換帶有ASCII對應字符的重音UTF-8字符。例如,替換Ruby 1.9.3中帶重音符號的字符,不帶導軌

Acsády --> Acsady 

傳統的做法是使用IConv包,它是Ruby標準庫的一部分。你可以做這樣的事情:

str = 'Acsády' 
IConv.iconv('ascii//TRANSLIT', 'utf8', str) 

這將產生

Acsa'dy 

一則有刪除的撇號。儘管此方法在Ruby 1.9.3中仍然有效,但我收到了一條警告,說明了這個問題IConv is deprecated and that String#encode should be used instead。但是,String#encode不提供完全相同的功能。未定義的字符在默認情況下會引發異常,但您可以通過設置undef =>:replace(將未定義的字符替換爲默認的'?'字符)或:fallback選項來處理這些異常:將未定義的源編碼字符映射到目標編碼。我想知道標準庫中是否有標準:回退哈希或通過某些gem,這樣我就不必編寫自己的哈希來處理所有可能的重音標記。

@ raina77ow: 感謝您的回覆。這正是我所期待的。然而,在查看鏈接到的線程之後,我意識到一個更好的解決方案可能是簡單地將無重音的字符與它們的重音等價物相匹配,就像數據庫使用字符集歸類的方式一樣。 Ruby是否有與排序規則等價的內容?

+0

哪種語言是這樣的口音? – texasbruce

+0

我所關心的口音來自一大堆歐洲語言。我正在處理一系列科學論文的作者。 –

+0

我懷疑這些寶石使用類似的哈希。至少我可以清楚地看到Text :: Unidecode是基於字符表的。 – raina77ow

回答

0

我想你要找的是類似於this question。如果是,您可以使用爲Ruby編寫的Text :: Unidecode的端口 - 例如this gem(或其分支的this,看起來可以在1.9中使用)。

2

我用這個:

def convert_to_ascii(s) 
    undefined = '' 
    fallback = { 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 
       'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 
       'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 
       'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 
       'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 
       'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'à' => 'a', 'á' => 'a', 
       'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 
       'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 
       'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ñ' => 'n', 
       'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 
       'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 
       'ý' => 'y', 'ÿ' => 'y' } 
    s.encode('ASCII', 
      fallback: lambda { |c| fallback.key?(c) ? fallback[c] : undefined }) 
end 

您可以check for other symbols you might want to provide fallback for here

相關問題