トップ «前の日記(2008-08-01) 最新 次の日記(2008-08-03)» 編集

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2008-08-02 [長年日記]

% [Ruby][Rails][ActiveSupport] Mac の合字ファイル名で困ったときには ActiveSupport::Multibyte::Chars#normalize で処理すべし

ref. Macの合字ファイル名で困ったときにはUnicode::Normalizeで処理すべし - 狐の王国

ちょうどたまたま同じことでわしも困っていて調べたので書いてみる。 ActiveSupport には ActiveSupport::Multibyte::Chars というクラスがあって、これは要するにマルチバイト文字列を扱うために拡張された String である。 で、基本的にはほとんどのメソッドは method_missing で Chars#handler が返すハンドラに丸投げされるんだが、デフォルトだとそのハンドラは ActiveSupport::Multibyte::Handlers::UTF8Handler というやつで、こいつが normalize というメソッドを持っている。

…… とまあ、中身的なことを長々と書いても読む方も面倒だろうから、この辺で本題に入ろう。 興味がある人はソースを読むといい。

さて、この機能の一番シンプルな使い方はおそらく以下のようになる。

% irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'active_support'
=> true
irb(main):003:0> 'hoge'.chars.normalize(:c)
=> #<ActiveSupport::Multibyte::Chars:0x115f828 @string="hoge">

もちろん Rails 環境であれば ActiveSupport は勝手に読み込まれるので 1, 2 行目は必要無い。 active_support を require することによって String クラスには chars というメソッドが追加される。 このメソッドは要するに ActiveSupport::Multibyte::Chars.new(self) ということをやっている。 で、Chars クラスに normalize(:c) というメッセージを投げると、method_missing によって ActiveSupport::Multibyte::Handlers::UTF8Handler.normalize(self.string, :c) という感じのものが実行される (細かいところは端折ってるので実際のソースとは違うよ)。

この場合、'hoge' という文字列を Normalization Form C で正規化するという意味になる。 サポートされている正規化方法は、

irb(main):004:0> ActiveSupport::Multibyte::NORMALIZATIONS_FORMS
=> [:c, :kc, :d, :kd]

というように、C, KC, D, KD の四つ。 normalize メソッドでは正規化方法の指定を省略できるが、デフォルトがなぜか KC なので注意が必要。 KC で正規化しちゃうと記号の類とかがごっそり変換される可能性があるので、場合によっては「正規化しすぎ」な状態になっちゃうかもしれない。 もちろんその方が嬉しいときもあるだろうから、その辺は必要に応じてということで。

ちなみに ActiveSupport が嫌いな人、特に core_ext によって組み込みクラスがごっそり拡張されてしまうのが我慢ならないような人は、active_support を require するのではなく active_support/multibyte だけ require すると良いかもしれない。

% irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'active_support/multibyte'
=> true
irb(main):003:0> ActiveSupport::Multibyte::Handlers::UTF8Handler.normalize('hoge', :c)
=> "hoge"
お名前:
E-mail:
コメント:

トップ «前の日記(2008-08-01) 最新 次の日記(2008-08-03)» 編集

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com