ruby 1.9.3 は iconv の非推奨について警告していますが、私は iconv を使用して分音記号を削除し、プレーン ASCII を使用しています。
Iconv.iconv('asccii//translit', 'utf-8', 'Těžiště')
戻りますTeziste
。String.encodeを使用してこれを取得するにはどうすればよいですか?
ruby 1.9.3 は iconv の非推奨について警告していますが、私は iconv を使用して分音記号を削除し、プレーン ASCII を使用しています。
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-utilsActiveSupport::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"
アクセントを取り除きます。
このアプローチはすべてを処理するわけではありませんが、おそらく十分です。