ruby1.9+Rails3でよく起きる問題。「incompatible character encodings: UTF-8 and ASCII-8BIT」

調べてみるとRailsではいろんな所で文字コード変換してらっしゃるようです。
最適な所で行っていると思いますが改めてみると怖いですね。
利用者は水漏れを防ぐような対処しか無いように思えます。

\gems\actionpack-3.0.3\lib\action_dispatch\http\parameters.rb(47,25)  [SJIS]:           return params.force_encoding("UTF-8").encode!
\gems\actionpack-3.0.3\lib\action_dispatch\http\request.rb(201,18)  [SJIS]:         raw_post.force_encoding(Encoding::BINARY) if raw_post.respond_to?(:force_encoding)
\gems\actionpack-3.0.3\lib\action_dispatch\routing\route_set.rb(509,33)  [SJIS]:               value = value.dup.force_encoding(Encoding::BINARY) if value.encoding_aware?
\gems\actionpack-3.0.3\lib\action_view\helpers\capture_helper.rb(169,15)  [SJIS]:           buf.force_encoding(output_buffer.encoding) if output_buffer.respond_to?(:encoding) && buf.respond_to?(:force_encoding)
\gems\actionpack-3.0.3\lib\action_view\template\error.rb(17,15)  [SJIS]:       @string.force_encoding("BINARY")
\gems\actionpack-3.0.3\lib\action_view\template\handlers\erb.rb(97,51)  [SJIS]:             template_source = template.source.dup.force_encoding("BINARY")
\gems\actionpack-3.0.3\lib\action_view\template\handlers\erb.rb(102,17)  [SJIS]:             erb.force_encoding valid_encoding(template.source.dup, encoding)
\gems\actionpack-3.0.3\lib\action_view\template\handlers\erb.rb(123,18)  [SJIS]:           string.force_encoding(encoding) if encoding
\gems\actionpack-3.0.3\lib\action_view\template.rb(206,18)  [SJIS]:           source.force_encoding(encoding)
\gems\actionpack-3.0.3\lib\action_view\template.rb(240,18)  [SJIS]:           source.force_encoding(code.encoding)
\gems\activerecord-3.0.3\lib\active_record\connection_adapters\sqlite_adapter.rb(18,33)  [SJIS]:           if value.respond_to?(:force_encoding) && value.encoding != Encoding::ASCII_8BIT
\gems\activerecord-3.0.3\lib\active_record\connection_adapters\sqlite_adapter.rb(19,27)  [SJIS]:             value = value.force_encoding(Encoding::ASCII_8BIT)
\gems\activesupport-3.0.3\lib\active_support\core_ext\string\access.rb(4,29)  [SJIS]:   unless '1.9'.respond_to?(:force_encoding)
\gems\activesupport-3.0.3\lib\active_support\core_ext\string\multibyte.rb(52,13)  [EUC]:         dup.force_encoding(Encoding::UTF_8).valid_encoding?
\gems\activesupport-3.0.3\lib\active_support\core_ext\string\output_safety.rb(71,21)  [SJIS]:       value = value.force_encoding(Encoding::UTF_8)
\gems\activesupport-3.0.3\lib\active_support\core_ext\uri.rb(18,56)  [SJIS]:         str.gsub(escaped) { [$&[1, 2].hex].pack('C') }.force_encoding(enc)
\gems\activesupport-3.0.3\lib\active_support\json\encoding.rb(122,34)  [SJIS]:           if string.respond_to?(:force_encoding)
\gems\activesupport-3.0.3\lib\active_support\json\encoding.rb(123,75)  [SJIS]:             string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY)
\gems\activesupport-3.0.3\lib\active_support\json\encoding.rb(133,16)  [SJIS]:           json.force_encoding(::Encoding::UTF_8) if json.respond_to?(:force_encoding)
\gems\activesupport-3.0.3\lib\active_support\multibyte\chars.rb(45,27)  [UTF-8]:           @wrapped_string.force_encoding(Encoding::UTF_8) unless @wrapped_string.frozen?
\gems\activesupport-3.0.3\lib\active_support\multibyte\chars.rb(434,43)  [UTF-8]:           if @wrapped_string.respond_to?(:force_encoding)
\gems\activesupport-3.0.3\lib\active_support\multibyte\chars.rb(435,51)  [UTF-8]:             @wrapped_string = @wrapped_string.dup.force_encoding(Encoding::ASCII_8BIT)
\gems\activesupport-3.0.3\lib\active_support\multibyte\utils.rb(42,30)  [SJIS]:     if 'string'.respond_to?(:force_encoding)
\gems\mail-2.2.10\lib\mail\attachments_list.rb(71,35)  [SJIS]:       if hash[:body].respond_to? :force_encoding and hash[:body].respond_to? :valid_encoding?
\gems\mail-2.2.10\lib\mail\attachments_list.rb(73,23)  [SJIS]:           hash[:body].force_encoding("BINARY")
\gems\mail-2.2.10\lib\mail\attachments_list.rb(96,41)  [SJIS]:         new_file = String.new(filename).force_encoding(Encoding::BINARY)
\gems\mail-2.2.10\lib\mail\attachments_list.rb(97,34)  [SJIS]:         ext = new_file.split('.'.force_encoding(Encoding::BINARY)).last
\gems\mail-2.2.10\lib\mail\attachments_list.rb(98,34)  [SJIS]:         filename = "file.#{ext}".force_encoding('US-ASCII')
\gems\mail-2.2.10\lib\mail\version_specific\ruby_1_9.rb(30,31)  [SJIS]:       str.unpack( 'm' ).first.force_encoding(Encoding::BINARY)
\gems\mail-2.2.10\lib\mail\version_specific\ruby_1_9.rb(55,13)  [SJIS]:         str.force_encoding(encoding)
\gems\mail-2.2.10\lib\mail\version_specific\ruby_1_9.rb(70,13)  [SJIS]:         str.force_encoding(encoding)
\gems\mail-2.2.10\lib\mail\version_specific\ruby_1_9.rb(77,14)  [SJIS]:       string.force_encoding(encoding) if encoding
\gems\mail-2.2.10\lib\mail\patterns.rb(14,29)  [SJIS]:     if control.respond_to?(:force_encoding)
\gems\mail-2.2.10\lib\mail\patterns.rb(15,25)  [SJIS]:       control = control.force_encoding(Encoding::BINARY)
\gems\mail-2.2.10\lib\mail\utilities.rb(22,13)  [SJIS]:         str.force_encoding('ASCII-8BIT')
\gems\mail-2.2.10\lib\mail\utilities.rb(24,23)  [SJIS]:           dquote(str).force_encoding(original_encoding)
\gems\mail-2.2.10\lib\mail\utilities.rb(26,15)  [SJIS]:           str.force_encoding(original_encoding)
\gems\rack-1.2.1\lib\rack\mock.rb(119,17)  [SJIS]:       empty_str.force_encoding("ASCII-8BIT") if empty_str.respond_to? :force_encoding
\gems\rack-1.2.1\test\spec_lint.rb(461,15)  [SJIS]:     hello_str.force_encoding("ASCII-8BIT") if hello_str.respond_to? :force_encoding
\gems\rack-1.2.1\test\spec_request.rb(484,11)  [SJIS]:     input.force_encoding("ASCII-8BIT") if input.respond_to? :force_encoding
\gems\rack-1.2.1\test\spec_utils.rb(14,15)  [SJIS]:     matz_name.force_encoding("UTF-8") if matz_name.respond_to? :force_encoding
\gems\rack-1.2.1\test\spec_utils.rb(17,19)  [SJIS]:     matz_name_sep.force_encoding("UTF-8") if matz_name_sep.respond_to? :force_encoding
\gems\rack-mount-0.6.13\lib\rack\mount\utils.rb(76,24)  [SJIS]:     if ''.respond_to?(:force_encoding)
\gems\rack-mount-0.6.13\lib\rack\mount\utils.rb(78,30)  [SJIS]:         Parser.unescape(uri).force_encoding('utf-8')
\gems\rack-test-0.5.6\lib\rack\test\utils.rb(99,65)  [SJIS]:             Rack::Test.encoding_aware_strings? ? primitive_part.force_encoding('BINARY') : primitive_part
\gems\rack-test-0.5.6\spec\rack\test\multipart_spec.rb(61,60)  [UTF-8]:         last_request.POST["utf8"].should == "\xE2\x98\x83".force_encoding("BINARY")


最終的なエラーポイントのみ対応して、本質改善を待つとします。

activesupport (3.0.3) lib/active_support/core_ext/string/output_safety.rb:75:in `concat'
activesupport (3.0.3) lib/active_support/core_ext/string/output_safety.rb:75:in `concat'
actionpack (3.0.3) lib/action_view/template/handlers/erb.rb:14:in `<<'
app/views/books/index.html.erb:18:in `block in _app_views_books_index_html_erb___820346256_31373796__405404607'
app/views/books/index.html.erb:14:in `each'
app/views/books/index.html.erb:14:in `_app_views_books_index_html_erb___820346256_31373796__405404607'
actionpack (3.0.3) lib/action_view/template.rb:135:in `block in render'
activesupport (3.0.3) lib/active_support/notifications.rb:54:in `instrument'
actionpack (3.0.3) lib/action_view/template.rb:127:in `render'
actionpack (3.0.3) lib/action_view/render/rendering.rb:59:in `block in _render_template'
activesupport (3.0.3) lib/active_support/notifications.rb:52:in `block in instrument'
activesupport (3.0.3) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
activesupport (3.0.3) lib/active_support/notifications.rb:52:in `instrument'
actionpack (3.0.3) lib/action_view/render/rendering.rb:56:in `_render_template'
actionpack (3.0.3) lib/action_view/render/rendering.rb:26:in `render'
actionpack (3.0.3) lib/abstract_controller/rendering.rb:114:in `_render_template'
actionpack (3.0.3) lib/abstract_controller/rendering.rb:108:in `render_to_body'
actionpack (3.0.3) lib/action_controller/metal/renderers.rb:47:in `render_to_body'
actionpack (3.0.3) lib/action_controller/metal/compatibility.rb:55:in `render_to_body'
actionpack (3.0.3) lib/abstract_controller/rendering.rb:101:in `render_to_string'
actionpack (3.0.3) lib/abstract_controller/rendering.rb:92:in `render'
actionpack (3.0.3) lib/action_controller/metal/rendering.rb:17:in `render'
actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
activesupport (3.0.3) lib/active_support/core_ext/benchmark.rb:5:in `block in ms'


改善について上記のエラーの通り「\activesupport-3.0.3\lib\active_support\core_ext\string\output_safety.rb」について行います。


※本記事はエラーが発生した一例です。一概に活用できるとは限りません。