BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

Ruby1.9+Rails3で"incompatible character encodings: UTF-8 and ASCII-8BIT"の対策

Ruby 1.9Rails 3.0を使っているとよく出るというエラー。あるいはSQLiteも原因のひとつかもしれない?

incompatible character encodings: UTF-8 and ASCII-8BIT

ググると色々情報が出てくるけど、あまり綺麗な対応方法が見つからない...

エラーのFull Traceを見てみたらこうなってた。

vendor/bundle/ruby/1.9.1/gems/activesupport-3.0.7/lib/active_support/core_ext/string/output_safety.rb:80:in `concat'

output_safety.rbを見てみると、ここにパッチを当てれば対応できそう。

でもbundlerを使っているで、インストールの度にパッチ当てなきゃとか良くない。

Rails本体には手を入れないモンキーパッチで解決したい。する。

まず、lib/output_safty_encoding_patch.rbを作る。

module ActiveSupport
  class SafeBuffer < String
    def concat(value)
      if value.html_safe?
        super(value.force_encoding('utf-8'))
      else
        super(ERB::Util.h(value.force_encoding('utf-8')))
      end
    end
    alias << concat
  end
end

続いて、config/application.rbの中に次のように書いておく。

require 'output_safty_encoding_patch'

これで解決した。

でも完全に解決したかどうかは分かりません。