1

ruby 1.9.3 对 iconv 弃用发出警告,但我使用 iconv 删除变音符号以从

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

返回Teziste。如何使用String.encode获得这个?

4

1 回答 1

4

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

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

得到'Teziste'. :kd本质上将您的重音字符分解为单独的重音字符和字符,然后\p{^Mn}从字符流中删除所有非间距标记,当您将它们全部放回一起时join,您会得到未重音的字符串。

如果您手边没有 Rails 或 ActiveSupport,那么您可以使用UnicodeUtils.compatibility_decompositionfrom unicode-utils而不是ActiveSupport::Multibyte::Unicode.normalize

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

我倾向于String在 Rails-land 中修补 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" 

去除口音。

这种方法不能处理所有事情,但可能已经足够了。

于 2013-11-26T23:20:29.360 回答