rails + mongrel_rails でeuc-jpを使うまでの道のり。

railseuc-jpで開発する必要があったので$KCODE="e"ってconfig/enviroment.rbに書いてみた。
起動しないorz

vendor/rails/activerecord/lib/../../activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb:118: unmatched (: /(     | (RegexpError)
|^K|^L|^M| |<U+0085>| |<E1><9A>\200|&#6158;|<E2><80>\200|<E2><80>\201|<E2><80>\202|<E2><80>\203|<E2><80>\204|<E2><80>\205|<E2><80>\206|<E2><80>\207|<E2><80>\210|<E2><80>\211|<E2><80>\212|<U+2028>|<U+2029>|&#8239;|<E2><81>\237|<E3><80>\200|
<U+FEFF>)+\Z/        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'

こんなエラーメッセージが出たのです。
utf8_handler.rbが、utf8のコードを使ってるので、エラーを起こしてるぽいですね。


utf8_handler.rbに、$KCODE='u'ってつけると解決したんですが、freezeしないといけないのが嫌くさい。
って、よく調べると、railsの起動時にrequireやってるのでエラーをおこしてるので、

Rails::Initializer.run do |config|
  # 略
end

$KCODE="e"

と、Initializerの後に書いてあげると解決した。


でも今度は、Webサーバにアクセスすると文字化けしてる。orz
firebug でレスポンスヘッダー見てみると、Content-Typeがtext/html; charset=utf-8 になってる!!!
HTML上に書いてたけど、mongrelが返してるみたい。

class ApplicationController < ActionController::Base
  # Pick a unique cookie name to distinguish our session data from others'
  session :session_key => '_nankanopurojekuto_session_id'
  before_filter :set_content_type

  def set_content_type
    @headers["Content-Type"] = "text/html; charset=euc-jp"
  end
end

Content-Typeって気づくまでに時間かかったけど、Applicationに、フィルタかけて、@headerを変更してあげて解決した。
(全ページがhtmlを返す場合に限るけど)


もろバッドノウハウで、mongrelのContent-Typeとか見てるとcgi.rbでoptions['charset']を返す様書いてあったので
設定によっては、きちんと返せる様なので、そちらで設定するべきかも。