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」について行います。
※本記事はエラーが発生した一例です。一概に活用できるとは限りません。