2

Ruby 1.9.3 を使用して、アクセント付きの UTF-8 文字を同等の ASCII 文字に置き換えたいと考えています。例えば、

Acsády  -->  Acsady

これを行う従来の方法は、Ruby の標準ライブラリの一部である IConv パッケージを使用することです。次のようなことができます。

str = 'Acsády'
IConv.iconv('ascii//TRANSLIT', 'utf8', str)

どちらが得られますか

Acsa'dy

次に、アポストロフィを削除する必要があります。この方法は Ruby 1.9.3 でも機能しますが、次のような警告が表示されIConv is deprecated and that String#encode should be used insteadます。ただし、String#encodeまったく同じ機能を提供するわけではありません。未定義の文字はデフォルトで例外をスローしますが、:undef=>:replace (未定義の文字をデフォルトの '?' 文字に置き換えます) を設定するか、未定義のソースエンコーディング文字をマップするハッシュに :fallback オプションを設定することで処理できます。ターゲットエンコーディング。考えられるすべてのアクセント記号を処理するために独自のハッシュを作成する必要がないように、標準ライブラリまたはいくつかの宝石で利用可能な標準の :fallback ハッシュがあるかどうか疑問に思っています。

@raina77ow: 返信ありがとうございます。それがまさに私が探していたものです。ただし、リンク先のスレッドを見た後、データベースが文字セットの照合を使用する方法で、アクセントのない文字をアクセントのある同等の文字に単純に一致させることがより良い解決策であることに気付きました。Rubyには照合に相当するものはありますか?

4

3 に答える 3

3

私はこれを使用します:

def convert_to_ascii(s)
  undefined = ''
  fallback = { 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A',
               'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C', 'È' => 'E', 'É' => 'E',
               'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I',
               'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O',
               'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U',
               'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'à' => 'a', 'á' => 'a',
               'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae',
               'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
               'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ñ' => 'n',
               'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o',
               'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u',
               'ý' => 'y', 'ÿ' => 'y' }
  s.encode('ASCII',
           fallback: lambda { |c| fallback.key?(c) ? fallback[c] : undefined })
end

ここでフォールバックを提供したい他のシンボルを確認できます

于 2014-04-01T09:02:18.620 に答える
0

あなたが探しているものは、この質問に似ていると思います。そうであれば、Ruby 用に書かれた Text::Unidecode のポートを使用できます。たとえば、このgem (またはこのフォークは 1.9 で使用できるように見えます) のように。

于 2012-06-18T21:49:56.523 に答える