ruby 1.9.3 警告 iconv 弃用,但我使用 iconv 删除变音符号以从
Iconv.iconv('asccii//translit', 'utf-8', 'Těžiště')
返回 Teziste
。我如何使用 String.encode 获得它?
如果我有 Rails(或只是 ActiveSupport),我会做这样的事情:
ActiveSupport::Multibyte::Unicode.normalize('Těžiště', :kd).chars.grep(/\p{^Mn}/).join('')
获取'Teziste'
. :kd
本质上 decomposes您的重音字符分为单独的重音和字符,然后是 \p{^Mn}
从字符流中删除所有非间距标记,当您将它们与 join
一起放回原位时, 你会得到无重音的字符串。
如果您手边没有 Rails 或 ActiveSupport,那么您可以使用 UnicodeUtils.compatibility_decomposition
来自 unicode-utils而不是 ActiveSupport::Multibyte::Unicode.normalize
:
> UnicodeUtils.compatibility_decomposition('Těžiště').chars.grep(/\p{^Mn}/).join('')
=> "Teziste"
我倾向于将 ActiveSupport 版本修补到 String
在 Rails 领域:
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"
去掉重音。
这种方法不能处理所有事情,但也许足够了。
我是一名优秀的程序员,十分优秀!