iconv将来会被弃用,音译

时间:2013-11-26 18:20:47

标签: ruby encoding deprecated iconv transliteration

ruby​​ 1.9.3是关于iconv弃用的警告,但我使用iconv来删除变音符号,以便从

中获取纯ASCII
Iconv.iconv('asccii//translit', 'utf-8', 'Těžiště') 

返回Teziste。我如何使用String.encode获取此内容?

1 个答案:

答案 0 :(得分:4)

如果我有Rails(或只是ActiveSupport),我会做这样的事情:

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

获取'Teziste'。将:kd基本上decomposes您的重音字符分成单独的重音和字符,然后\p{^Mn}删除字符流中的所有非间距标记,并将它们全部放回join 1}},你得到了非重音字符串。

如果您没有方便的Rails或ActiveSupport,则可以使用UnicodeUtils.compatibility_decomposition中的unicode-utils代替ActiveSupport::Multibyte::Unicode.normalize

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

我倾向于在Rails-land中将ActiveSupport版本修补到String

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" 

删除重音符号。

这种方法不会处理所有事情,但可能会做得足够。