ruby 1.9.3是关于iconv弃用的警告,但我使用iconv来删除变音符号,以便从
中获取纯ASCIIIconv.iconv('asccii//translit', 'utf-8', 'Těžiště')
返回Teziste
。我如何使用String.encode获取此内容?
答案 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"
删除重音符号。
这种方法不会处理所有事情,但可能会做得足够。