From: Kenta Murata Date: 2010-04-30T19:19:22+09:00 Subject: [ruby-dev:41123] Re: Rails3 M17N 村田です。 On 2010/04/30, at 18:20, NARUSE, Yui wrote: >> 今時のデータベースシステムはコネクションやテーブルやカラムがエンコーディングを持ってるので、 >> そのエンコーディングをドライバ側で紐づけてやるのが一番情報が落ちなくて良いと思います。 >> それでPostgreSQLのアダプタにはそういうパッチを送ってacceptされました。 > > SQLite3 のドライバである、sqlite3-ruby も次のバージョンでエンコーディングを > 設定するようになります。 (thanks Aaron) この対応は非常に嬉しいです。 > Rails のデフォルトである SQLite3 が非対応だったので踏む人が多かったのだと思いますが、 > これで今後は減っていくんじゃないでしょうか。 私は現状では、以下のような機能を ActiveRecord へ注入することで対処しています。 http://gist.github.com/381834 if defined?(ActiveRecord) class ActiveRecord::Base def read_attribute_with_enforcing_utf8(attr_name) v = read_attribute_without_enforcing_utf8(attr_name) if String === v && column_for_attribute(attr_name).text? return v.force_encoding(Encoding::UTF_8) if v.encoding == Encoding::ASCII_8BIT end return v end alias_method_chain :read_attribute, :enforcing_utf8 class << self private def define_read_method_with_enforcing_utf8(symbol, attr_name, column) define_read_method_without_enforcing_utf8(symbol, attr_name, column) if column.text? self.class_eval <<-END_DEFINITION, __FILE__, __LINE__ def #{symbol}_with_enforcing_utf8 v = #{symbol}_without_enforcing_utf8 v = v.force_encoding(Encoding::UTF_8) if v && v.encoding == Encoding::ASCII_8BIT return v end alias_method_chain :#{symbol}, :enforcing_utf8 END_DEFINITION end end alias_method_chain :define_read_method, :enforcing_utf8 end end end -- Kenta Murata OpenPGP FP = FA26 35D7 4F98 3498 0810 E0D5 F213 966F E9EB 0BCC 本を書きました!! 『Ruby 逆引きレシピ』 http://www.amazon.co.jp/dp/4798119881/mrkn-22 E-mail: mrkn@mrkn.jp twitter: http://twitter.com/mrkn/ blog: http://d.hatena.ne.jp/mrkn/