ruby 1.9.3 对 iconv 弃用发出警告,但我使用 iconv 删除变音符号以从
Iconv.iconv('asccii//translit', 'utf-8', 'Těžiště')
返回Teziste
。如何使用String.encode获得这个?
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
本质上将您的重音字符分解为单独的重音字符和字符,然后\p{^Mn}
从字符流中删除所有非间距标记,当您将它们全部放回一起时join
,您会得到未重音的字符串。
如果您手边没有 Rails 或 ActiveSupport,那么您可以使用UnicodeUtils.compatibility_decomposition
from 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"
去除口音。
这种方法不能处理所有事情,但可能已经足够了。