不兼容的字符编码:ASCII-8BIT和UTF-8

时间:2011-03-12 22:55:51

标签: ruby-on-rails ruby ruby-on-rails-3 haml

我使用Ruby 1.9.2和Rails 3.0.5

我有以下错误:

  

不兼容的字符编码:ASCII-8BIT和UTF-8

我认为它与数据库无关。

错误正在视图中的这一行上ha(只是一个div haml调用):

#content

完整筹码:

    ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8):
        21:                     -flash.each do |name, msg|
        22:                         =content_tag :div, msg, :id => "flash_#{name}"
        23:                         %div.clear                      
        24:                     #content                                        
        25:                         = yield
        26:             = render :partial => "layouts/grid_right" if render_grid_right?
        27:             = render :partial => "layouts/footer"
      app/views/layouts/application.html.haml:24:in `_app_views_layouts_application_html_haml___4380000789490545718_2180251300_2717546578298801795'
      actionpack (3.0.5) lib/action_view/template.rb:135:in `block in render'
      activesupport (3.0.5) lib/active_support/notifications.rb:54:in `instrument'
      actionpack (3.0.5) lib/action_view/template.rb:127:in `render'
      actionpack (3.0.5) lib/action_view/render/layouts.rb:80:in `_render_layout'
      actionpack (3.0.5) lib/action_view/render/rendering.rb:62:in `block in _render_template'
      activesupport (3.0.5) lib/active_support/notifications.rb:52:in `block in instrument'
      activesupport (3.0.5) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
      activesupport (3.0.5) lib/active_support/notifications.rb:52:in `instrument'
      actionpack (3.0.5) lib/action_view/render/rendering.rb:56:in `_render_template'
      actionpack (3.0.5) lib/action_view/render/rendering.rb:26:in `render'
      haml (3.0.25) lib/haml/helpers/action_view_mods.rb:13:in `render_with_haml'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:115:in `_render_template'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:109:in `render_to_body'
      actionpack (3.0.5) lib/action_controller/metal/renderers.rb:47:in `render_to_body'
      actionpack (3.0.5) lib/action_controller/metal/compatibility.rb:55:in `render_to_body'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:102:in `render_to_string'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:93:in `render'
      actionpack (3.0.5) lib/action_controller/metal/rendering.rb:17:in `render'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
      activesupport (3.0.5) lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
      /Users/michaelkoper/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/benchmark.rb:309:in `realtime'
      activesupport (3.0.5) lib/active_support/core_ext/benchmark.rb:5:in `ms'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:40:in `block in render'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:78:in `cleanup_view_runtime'
      activerecord (3.0.5) lib/active_record/railties/controller_runtime.rb:15:in `cleanup_view_runtime'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:39:in `render'
      actionpack (3.0.5) lib/action_controller/metal/implicit_render.rb:10:in `default_render'
      actionpack (3.0.5) lib/action_controller/metal/mime_responds.rb:261:in `block in retrieve_response_from_mimes'
      actionpack (3.0.5) lib/action_controller/metal/mime_responds.rb:192:in `call'
      actionpack (3.0.5) lib/action_controller/metal/mime_responds.rb:192:in `respond_to'
      app/controllers/home_controller.rb:9:in `index'
      actionpack (3.0.5) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
      actionpack (3.0.5) lib/abstract_controller/base.rb:150:in `process_action'
      actionpack (3.0.5) lib/action_controller/metal/rendering.rb:11:in `process_action'
      actionpack (3.0.5) lib/abstract_controller/callbacks.rb:18:in `block in process_action'
      activesupport (3.0.5) lib/active_support/callbacks.rb:445:in `_run__3968431659371141392__process_action__3163094469870857953__callbacks'
      activesupport (3.0.5) lib/active_support/callbacks.rb:409:in `_run_process_action_callbacks'
      activesupport (3.0.5) lib/active_support/callbacks.rb:93:in `run_callbacks'
      actionpack (3.0.5) lib/abstract_controller/callbacks.rb:17:in `process_action'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action'
      activesupport (3.0.5) lib/active_support/notifications.rb:52:in `block in instrument'
      activesupport (3.0.5) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
      activesupport (3.0.5) lib/active_support/notifications.rb:52:in `instrument'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:29:in `process_action'
      actionpack (3.0.5) lib/action_controller/metal/rescue.rb:17:in `process_action'
      actionpack (3.0.5) lib/abstract_controller/base.rb:119:in `process'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:41:in `process'
      actionpack (3.0.5) lib/action_controller/metal.rb:138:in `dispatch'
      actionpack (3.0.5) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
      actionpack (3.0.5) lib/action_controller/metal.rb:178:in `block in action'
      actionpack (3.0.5) lib/action_dispatch/routing/route_set.rb:62:in `call'
      actionpack (3.0.5) lib/action_dispatch/routing/route_set.rb:62:in `dispatch'
      actionpack (3.0.5) lib/action_dispatch/routing/route_set.rb:27:in `call'
      rack-mount (0.6.13) lib/rack/mount/route_set.rb:148:in `block in call'
      rack-mount (0.6.13) lib/rack/mount/code_generation.rb:93:in `block in recognize'
      rack-mount (0.6.13) lib/rack/mount/code_generation.rb:68:in `optimized_each'
      rack-mount (0.6.13) lib/rack/mount/code_generation.rb:92:in `recognize'
      rack-mount (0.6.13) lib/rack/mount/route_set.rb:139:in `call'
      actionpack (3.0.5) lib/action_dispatch/routing/route_set.rb:492:in `call'
      haml (3.0.25) lib/sass/plugin/rack.rb:41:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/head.rb:14:in `call'
      rack (1.2.1) lib/rack/methodoverride.rb:24:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/flash.rb:182:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/cookies.rb:302:in `call'
      activerecord (3.0.5) lib/active_record/query_cache.rb:32:in `block in call'
      activerecord (3.0.5) lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
      activerecord (3.0.5) lib/active_record/query_cache.rb:12:in `cache'
      activerecord (3.0.5) lib/active_record/query_cache.rb:31:in `call'
      activerecord (3.0.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/callbacks.rb:46:in `block in call'
      activesupport (3.0.5) lib/active_support/callbacks.rb:415:in `_run_call_callbacks'
      actionpack (3.0.5) lib/action_dispatch/middleware/callbacks.rb:44:in `call'
      rack (1.2.1) lib/rack/sendfile.rb:107:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
      railties (3.0.5) lib/rails/rack/logger.rb:13:in `call'
      rack (1.2.1) lib/rack/runtime.rb:17:in `call'
      activesupport (3.0.5) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
      rack (1.2.1) lib/rack/lock.rb:11:in `block in call'
      <internal:prelude>:10:in `synchronize'
      rack (1.2.1) lib/rack/lock.rb:11:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/static.rb:30:in `call'
      railties (3.0.5) lib/rails/application.rb:168:in `call'
      railties (3.0.5) lib/rails/application.rb:77:in `method_missing'
      railties (3.0.5) lib/rails/rack/log_tailer.rb:14:in `call'
      rack (1.2.1) lib/rack/content_length.rb:13:in `call'
      rack (1.2.1) lib/rack/chunked.rb:15:in `call'
      rack (1.2.1) lib/rack/handler/mongrel.rb:67:in `process'
      mongrel (1.2.0.pre2) lib/mongrel.rb:165:in `block in process_client'
      mongrel (1.2.0.pre2) lib/mongrel.rb:164:in `each'
      mongrel (1.2.0.pre2) lib/mongrel.rb:164:in `process_client'
      mongrel (1.2.0.pre2) lib/mongrel.rb:291:in `block (2 levels) in run'

我的宝石:

        Using rake (0.8.7) 
        Using RedCloth (4.2.2) 
        Using abstract (1.0.0) 
        Using activesupport (3.0.5) 
        Using builder (2.1.2) 
        Using i18n (0.5.0) 
        Using activemodel (3.0.5) 
        Using erubis (2.6.6) 
        Using rack (1.2.1) 
        Using rack-mount (0.6.13) 
        Using rack-test (0.5.7) 
        Using tzinfo (0.3.24) 
        Using actionpack (3.0.5) 
        Using mime-types (1.16) 
        Using polyglot (0.3.1) 
        Using treetop (1.4.9) 
        Using mail (2.2.15) 
        Using actionmailer (3.0.5) 
        Using arel (2.0.9) 
        Using activerecord (3.0.5) 
        Using activeresource (3.0.5) 
        Using authlogic (2.1.6) 
        Using xml-simple (1.0.14) 
        Using aws-s3 (0.6.2) 
        Using block_helpers (0.3.3) 
        Using bundler (1.0.10) 
        Using diff-lcs (1.1.2) 
        Using json (1.4.6) 
        Using gherkin (2.3.4) 
        Using term-ansicolor (1.0.5) 
        Using cucumber (0.10.0) 
        Using cucumber-rails (0.3.2) 
        Using daemons (1.0.10) 
        Using database_cleaner (0.6.5) 
        Using factory_girl (1.3.3) 
        Using faker (0.9.5) 
        Using formtastic (1.2.3) 
        Using gem_plugin (0.2.3) 
        Using haml (3.0.25) 
        Using thor (0.14.6) 
        Using railties (3.0.5) 
        Using rails (3.0.5) 
        Using kaminari (0.10.4) 
        Using mongrel (1.2.0.pre2) 
        Using mysql2 (0.2.6) 
        Using nokogiri (1.4.4) 
        Using paperclip (2.3.8) 
        Using rspec-core (2.5.1) 
        Using rspec-expectations (2.5.0) 
        Using rspec-mocks (2.5.0) 
        Using rspec (2.5.0) 
        Using yard (0.6.4) 
        Using pickle (0.4.4) 
        Using populator (1.0.0) 
        Using rspec-rails (2.5.0) 
        Using webrat (0.7.3) 

18 个答案:

答案 0 :(得分:62)

我按照以下步骤解决了这个问题:

  • 确保config.encoding = "utf-8"位于application.rb文件中。
  • 确保您使用的是'mysql2'宝石。
  • # encoding: utf-8放在包含UTF-8字符的文件顶部。
  • 在environment.rb文件的<App Name>::Application.initialize!行上方,添加以下两行:

    Encoding.default_external = Encoding::UTF_8
    Encoding.default_internal = Encoding::UTF_8
    

http://rorguide.blogspot.com/2011/06/incompatible-character-encodings-ascii.html

答案 1 :(得分:44)

尝试找到导致此问题的确切行,然后强制执行UTF8编码,此解决方案对我有用。

  

title.to_s.force_encoding( “UTF-8”)

答案 2 :(得分:15)

我怀疑您是将Haml模板的一部分复制/粘贴到文件中,还是使用非Unicode /非UTF-8友好编辑器。

看看你是否可以在UTF-8友好编辑器中从头开始重新创建该文件。任何平台都有很多,看看这是否能解决您的问题。首先删除#content行并手动重新输入。

答案 3 :(得分:11)

ASCII-8BIT是Ruby对普通0-0x7f ASCII字符集之上字符的描述,它是单字节字符。通常情况下,这将是ISO-8859-1,或其兄弟之一。

如果您可以识别导致问题的字符,那么您可以告诉Ruby 1.9.2将该字符的字符集转换为UTF-8。

詹姆斯格雷写了series of blogs谈论这些问题以及如何处理它们。我建议你去看看。

  

不兼容的字符编码:ASCII-8BIT和UTF-8

这通常是因为您尝试连接两个字符串,而一个字符包含不映射到另一个字符串的字符集的字符。 ISO-8859-1中的字符在UTF-8中没有等效字符,反之亦然,如何处理字符串连接与这些不兼容性需要程序员介入。

答案 4 :(得分:6)

我安装了gem包mysql2。

gem install mysql2

然后我在database.yml中更改了mysql2中的适配器。

答案 5 :(得分:6)

您可以使用force_encoding(Encoding::UTF_8)

强制使用UTF8

示例:

<%= yield.force_encoding(Encoding::UTF_8) %>

答案 6 :(得分:5)

对于Haml提出了编码提示:

-# coding: UTF-8
在Haml页面的左上角

答案 7 :(得分:4)

问题是在iOS版本周围使用了错误的引号。确保所有引号都是'而不是'或'。

https://github.com/CocoaPods/CocoaPods/issues/829

答案 8 :(得分:2)

我在将应用程序从Ruby 1.8.7迁移到1.9.3时遇到错误,它只在生产中发生。事实证明我的Memcache商店里有一些剩菜。我的应用程序现在编码敏感的Ruby 1.9.3版本试图将旧的ASCII-8BIT值与新的UTF-8混合。

就像刷新缓存来为我修复它一样简单。

答案 9 :(得分:2)

我遇到过类似的问题。虽然我已经解决了UTF-8编码(使用mysql2和Encoding.default_external = Encoding :: UTF_8 ...)不兼容的字符编码:UTF-8和ASCII-8BIT 在我使用不正确的帮助器参数时出现例如f.button :submit, "Zrušiť" - 效果很好但f.button "Zrušiť" - 抛出编码错误。

答案 10 :(得分:2)

为防止错误“无法修改冻结字符串”以编码变量,您可以使用:var.dup.force_encoding(Encoding::ASCII_8BIT)var.dup.force_encoding(Encoding::UTF_8)

答案 11 :(得分:0)

我在自定义CoffeeScript文件上遇到类似问题。我通过将endline编码从“Unix / Linux”更改为“Mac OS Classic”来解决它

答案 12 :(得分:0)

使用rails-latex-gem创建pdf文档会导致类似的问题。 我通过将layouts/application.pdf.erb修改为

来解决了这个问题
\begin{document}

<%= yield.force_encoding("UTF-8") %>


\end{document}

答案 13 :(得分:0)

我遇到这个问题很奇怪,因为我忘了指定'type'参数。例如:

add_column :cms_push_msgs, :android_title

应该是:

add_column :cms_push_msgs, :android_content, :string 

答案 14 :(得分:0)

仅供记录:对我而言,事实证明它是名为'mysql'的宝石......显然这是使用 US-ASCII 8位默认。因此将其更改为名为 mysql2 的宝石(这里的重点是2)解决了我的所有问题。

我看了@上面发布的宝石列表 - Michael Koper显然已经安装了mysql2但是我发布了这个以防有人也有这个问题..(花了一些时间来弄清楚)。

如果您不喜欢这个答案,请发表评论,我会将其删除。

P.S:德语变音符号(ä,ö和ü)用mysql搞砸了

答案 15 :(得分:0)

在解析Ruby 1.9.2上的CSV文件时,我遇到了同样的问题,这些文件在Ruby 1.8上被正确解析。我找到了答案here。使用Ruby CSV模块打开CSV文件时,必须指定UTF-8 enconding,如下所示:

CSV.foreach("file.txt", encoding: "UTF-8") do |row|
   # foo and bar correctly encoded
   foo, bar, ... = row
end

答案 16 :(得分:0)

我有一个类似的问题,宝石字符串擦洗为我自动修复它。 https://github.com/hsbt/string-scrub如果给定的字符串包含无效的字节序列,则该无效字节序列将替换为unicode替换字符( ),并返回一个新字符串。

答案 17 :(得分:0)

我在最近的一个项目中得到了来自Rails 4.1,Ruby 2.3.3的相同的神秘错误消息,来自布局application.html.haml的stacktrace

经过一场疯狂的追逐,罪魁祸首是一个UTF-8角色,最近被添加到所有页面的页脚中。出于某些奇怪的原因,错误只会间歇性地出现。

用相应的HTML转义序列&#xHHHH;替换UTF-8字符解决了这个问题。

我希望将来可以节省其他人的时间..