2013-11-26 63 views
1

紅寶石1.9.3警告有關的iconv棄用,但我用的iconv從的iconv將在未來被廢棄,音譯

Iconv.iconv('asccii//translit', 'utf-8', 'Těžiště') 

回報Teziste刪除變音符號有純ASCII。我如何使用String.encode獲得這個結果?

+0

您的預期輸出和輸入是什麼? –

+0

你確定它不是「ascii // translit」嗎? – sawa

+0

@ArupRakshit:認爲'Těžiště''顯然是輸入,'Teziste'是預期的輸出。 –

回答

3

如果我有滑軌(或只是的ActiveSupport)的時候,我會做這樣的事情:

ActiveSupport::Multibyte::Unicode.normalize('Těžiště', :kd).chars.grep(/\p{^Mn}/).join('') 

得到'Teziste':kd基本上decomposes您的重音字符分爲不同的重音符號和字符,然後\p{^Mn}刪除字符流中的所有非間距標記,並且當您將它與join重新組合在一起時,會返回無重音字符串。

如果沒有欄杆或方便的ActiveSupport,那麼你可以使用UnicodeUtils.compatibility_decompositionunicode-utils而不是ActiveSupport::Multibyte::Unicode.normalize

> UnicodeUtils.compatibility_decomposition('Těžiště').chars.grep(/\p{^Mn}/).join('') 
=> "Teziste" 

我往往在Rails的土地跳線設置到String的版本的ActiveSupport:

def de_accent 
    # 
    # `\p{Mn}` is also known as `\p{Nonspacing_Mark}` but only the short 
    # and cryptic form is documented. 
    # 
    ActiveSupport::Multibyte::Unicode.normalize(self, :kd).chars.grep(/\p{^Mn}/).join('') 
end 

,這樣我可以說這樣的話:

> s = 'Těžiště'.de_accent 
=> "Teziste" 

去除重音。

這種方法不會處理所有事情,但也許它會做得足夠。

+1

它非常接近。但是......''Groß'.de_accent=>'Groß''(不是像'iconv'中的'Gross') – vitas

+0

@vitas:問題是'ß'發生了什麼,就像區域設置依賴, '取決於語言環境。這對臭名昭着的土耳其人我也沒有做任何事情。我建議圍繞unicode-utils狩獵,看看有沒有什麼東西可以滿足你的需求。 –