1. ホーム
  2. ruby-on-rails

Rubyでアクセント付きのラテン文字を置き換えるにはどうしたらいいですか?

2023-07-30 03:03:01

質問

私は ActiveRecord というモデルがあります。 Foo を持つ name フィールドがあります。 ユーザーが名前で検索できるようにしたいのですが、検索では大文字と小文字を無視するようにしたいのです。 したがって、私は canonical_name フィールドも保存しています。

class Foo
  validates_presence_of :name

  before_validate :set_canonical_name

  private

  def set_canonical_name
    self.canonical_name ||= canonicalize(self.name) if self.name
  end

  def canonicalize(x)
    x.downcase.  # something here
  end
end

アクセント付きの文字を置き換えるために、"something here"を記入する必要があります。 より良いものはありますか?

x.downcase.gsub(/[àáâãäå]/,'a').gsub(/æ/,'ae').gsub(/ç/, 'c').gsub(/[èéêë]/,'e')....

さらに言えば、私はRuby 1.9を使っていないので、これらのUnicodeリテラルを私のコードに入れることはできません。 実際の正規表現はもっと醜いものになるでしょう。

どのように解決するのか?

Railsには正規化するビルトインがすでにあるので、これを使って文字列をKDの形に正規化し、それ以外の文字(アクセント記号など)をこのように削除すればよいのです。

>> "àáâãäå".mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.to_s
=> "aaaaaa"