1

ruby 1.9.3 は iconv の非推奨について警告していますが、私は iconv を使用して分音記号を削除し、プレーン ASCII を使用しています。

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

戻りますTezisteString.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-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" 

アクセントを取り除きます。

このアプローチはすべてを処理するわけではありませんが、おそらく十分です。

于 2013-11-26T23:20:29.360 に答える