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

Posted

技术标签:

【中文标题】不兼容的字符编码:ASCII-8BIT 和 UTF-8【英文标题】:incompatible character encodings: ASCII-8BIT and UTF-8 【发布时间】:2011-07-14 06:06:45 【问题描述】:

我使用 Ruby 1.9.2 和 Rails 3.0.5

我有以下错误:

我认为与数据库无关。

错误发生在视图中的这一行(只是一个 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) 

【问题讨论】:

您的应用程序是否使用“UTF-8”或“ASCII-8BIT”作为默认编码。另外,如果您没有任何 Flash 消息,您会收到此错误吗? 我是这样解决的:***.com/questions/11478316/… 只是删除一条评论:我使用 TextEdit 编辑了一个文件,并将 ==>'` 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

经过一番追逐后,罪魁祸首是一个 UTF-8 字符,该字符最近已添加到所有页面的页脚。由于某些奇怪的原因,错误只会间歇性地出现。

将 UTF-8 字符替换为相应的 HTML 转义序列 &amp;#xHHHH; 解决了该问题。

我希望这可以为其他人节省一些时间。

【讨论】:

【参考方案3】:

您可以使用 force_encoding(Encoding::UTF_8) 强制 UTF8:

例子:

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

【讨论】:

【参考方案4】:

ASCII-8BIT 是 Ruby 对高于正常 0-0x7f ASCII 字符集的字符的描述,它们是单字节字符。通常,这将类似于 ISO-8859-1 或其兄弟姐妹之一。

如果您可以确定是哪个字符导致了问题,那么您可以告诉 Ruby 1.9.2 将该字符的字符集转换为 UTF-8。

James Gray 写了一个series of blogs 谈论这些问题以及如何处理它们。我建议通过它们。

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

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

【讨论】:

Ruby 对 ISO-8859-1 的描述是“ISO-8859-1”。 “ASCII-8BIT”是 ruby​​ 对二进制数据的描述。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

在 Ruby 1.9.2 上解析在 Ruby 1.8 上正确解析的 CSV 文件时,我遇到了同样的问题。我找到了答案here。使用 Ruby CSV 模块打开 CSV 文件时,需要指定 UTF-8 编码如下:

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

仅作记录:对我来说,它原来是名为 'mysql' 的 gem ... 显然这适用于 US-ASCII 8 位默认。因此,将其更改为名为 mysql2 的 gem(这里的 2 是重点)解决了我所有的问题。

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

如果你不喜欢这个答案,请评论,我会删除它。

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

【讨论】:

请务必在 Gemfile 和 database.yml 中将 mysql 切换为 mysql2【参考方案10】:

我安装了gem包mysql2。

gem install mysql2

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

【讨论】:

哇,是的,摇滚我的油炸它在这里工作! :D【参考方案11】:

我通过以下步骤解决了它:

确保 config.encoding = "utf-8" 在 application.rb 文件中。 确保您使用的是“mysql2”gem。 将# encoding: utf-8 放在包含UTF-8 字符的文件的顶部。

在 environment.rb 文件的&lt;App Name&gt;::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

【讨论】:

使用mysql2 对我来说效果很好,谢谢! - 将database.yml 中的适配器也更改为mysql2 我不得不按照这里的建议使用 gem 'mysql2', '***.com/questions/5840742/… 编辑 config/database.yml,将适配器 'mysql' 更改为 'mysql2' 然后就可以了! 另请注意,Encoding.default_external = Encoding::UTF_8 似乎不适用于/lib 文件夹中的 ruby​​ 文件。在每个文件的顶部添加# encoding: utf-8 对我有用!【参考方案12】:

为 Haml 提供编码提示:

-# coding: UTF-8

在 Haml 页面的左上角。

【讨论】:

【参考方案13】:

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

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

【讨论】:

感谢您的指挥。我确实有一个无效的字符。我在文本中有一个'。这非常困难,因为错误行不一样。感谢您的回答!【参考方案14】:

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

add_column :cms_push_msgs, :android_title

应该是:

add_column :cms_push_msgs, :android_content, :string 

【讨论】:

【参考方案15】:

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

解决了这个问题
\begindocument

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


\enddocument

【讨论】:

【参考方案16】:

我在自定义 CoffeeScript 文件中遇到了类似的问题。我通过将结束行编码从“Unix/Linux”更改为“Mac OS Classic”解决了这个问题

【讨论】:

【参考方案17】:

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

title.to_s.force_encoding("UTF-8")

【讨论】:

即使在标准红宝石中似乎也有一些功能似乎会导致这种情况。对我来说是 Digest::MD5.digest(Random.rand(10000).to_s) 当在控制器中从 rails 4.2.8 切换到 4.2.9 puts "debug URL is #request.fullpath" 导致错误,更改为 request.fullpath.inspect 解决了它。【参考方案18】:

我遇到过类似的问题。虽然我已经解决了 UTF-8 编码(使用 mysql2 和 Encoding.default_external = Encoding::UTF_8 ...)不兼容的字符编码:UTF-8 和 ASCII-8BIT 当我使用了不正确的辅助参数时出现了例如f.button :submit, "Zrušiť" - 完美运行,但 f.button "Zrušiť"- 引发编码错误。

【讨论】:

以上是关于不兼容的字符编码:ASCII-8BIT 和 UTF-8的主要内容,如果未能解决你的问题,请参考以下文章

ASCII-8BIT 中的 Rails 编码

为啥我会收到从 ASCII-8BIT 到 UTF-8 的字符串编码问题“\xE2”?

关于gbk, gb2312,unicode,utf-8等字符编码的问题

将非 ASCII 字符从 ASCII-8BIT 转换为 UTF-8

使用带有无效字符的 Net::FTP gettextfile (ASCII-8BIT vs UTF-8)

什么是UTF-8编码?