【问题标题】:Ruby on Rails 3, incompatible character encodings: UTF-8 and ASCII-8BIT with i18nRuby on Rails 3,不兼容的字符编码:UTF-8 和 ASCII-8BIT 与 i18n
【发布时间】:2011-05-10 11:24:21
【问题描述】:

我在使用 Rails 3.0.1、Ruby 1.9.2 和我的网站本地化时遇到了一些麻烦。

问题很简单,我在视图中有类似的东西:

f.input :zip_code, :label => I18n.t('labels.zip_code')

还有一个 es.yml 文件:

es:
  labels:
    zip_code: "Este código postal no es valido."

en.yml 文件没有问题(它是纯 ASCII),但是当网站设置为 i18n.locale == 'es' 时,我收到此错误:

incompatible character encodings: UTF-8 and ASCII-8BIT

我已经四处寻找了很长一段时间,但没有找到使用我的 UTF-8 翻译文件的方法。

有人知道如何让它工作吗?

感谢您的帮助。

【问题讨论】:

  • 这有点离题,但 Ryan Bates 今天刚刚在 i18n 上发布了一个 railscast (railscasts.com/episodes/256-i18n-backends)。如果有人在 2011 年 3 月 6 日这一周看到此评论,那么在某种程度上,此评论与您有关。
  • James 在他的博客上有一个非常不错的教程,几乎涵盖了 Ruby 1.9 中字符串编码的所有方面。要了解“外部”和“内部”编码的含义,请阅读:blog.grayproductions.net/articles/…
  • 下面是关于 Rails 编码的精彩解释:yehudakatz.com/2010/05/05/…

标签: ruby-on-rails ruby-on-rails-3 utf-8 internationalization character-encoding


【解决方案1】:

好的,经过几个小时的谷歌搜索,问题解决了......

我的代码中实际上有两个错误。第一个是文件编码错误,第二个是 MySQL 数据库配置的问题。

首先,为了解决MySQL引起的错误,我使用了这两篇文章:

http://www.dotkam.com/2008/09/14/configure-rails-and-mysql-to-support-utf-8/

http://www.rorra.com.ar/2010/07/30/rails-3-mysql-and-utf-8/

其次,为了解决文件编码问题,我在 config/environment.rb 中添加了这两行

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

希望这会对某人有所帮助:)

【讨论】:

  • 非常感谢!!有同样的问题,除了我使用的是 mysql gem 而不是 mysql2 之外,我一切正常。
  • 同样的事情发生在我身上,但我只是在源代码文件中有一个有趣的 ' 字符时才注意到它。我的 gemfile 中有 mysql 和 mysql2 gem,我必须删除旧的 mysql gem。 (并更改我的 database.yml 文件)
  • 老兄,你救了我一天或者一周!谢谢!
  • 我遇到了同样的错误,但是在使用 rails 缓存时。这是我的问题stackoverflow.com/questions/11114872/…
  • 啊啊啊啊!谢谢!还必须升级到 mysql2 gem 并相应地更新 database.yml。也为我工作。
【解决方案2】:

我通过结合多种解决方案解决了大部分问题:

  • 确保application.rb 有这行:config.encoding = "utf-8"
  • 确保您使用的是“mysql2”gem
  • # 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

【讨论】:

  • 这个答案:stackoverflow.com/a/4804802/72176 有一个很好的方法可以将建议的# encoding: UTF-8 添加到所有 ruby​​ 文件中。
  • 我只在我的控制器的第一个上添加了# encoding: utf-8,任何东西都很好。我在 Ruby 1.9.3 上有 Rails 3.2.7
  • 一句忠告:mysql2 gem只适用于MRI Ruby,不要和jruby一起使用。
  • 这对我有帮助,尤其是 Encoding.default_external 部分
【解决方案3】:

您确定您的 es.yml 文件已保存为 UTF-8 吗?

如果您使用的是 Windows,请使用 http://notepad-plus-plus.org/ 进行确认。

【讨论】:

    【解决方案4】:

    使用此解包功能帮助我最终解决了这个问题,如果您收到无法转换错误消息,请尝试以下操作:

    myString.unpack('U*').pack('U*')
    

    【讨论】:

    • 如果你必须在所有字符串上都这样做,这听起来有点 CPU 昂贵和痛苦......
    • 希望我可以有任何其他选项来阻止此错误,但它们对我不起作用。我没有注意到任何 cpu 增加,
    • 知道我稍后会再次尝试最佳答案解决方案只是因为并报告
    • 您的问题是来自数据库中的字符还是视图文件中的字符?
    • 嘿,还没有找到时间:/我在真正刮擦时遇到了这个问题,而且只有在它到达任何数据库之前。
    【解决方案5】:

    确保您的config/application.rb 中有config.encoding = "utf-8"。此外,您的示例翻译文件与您正在搜索的键(com_namefirst_name)不匹配,但我想这可能只是一个错字。

    【讨论】:

    • Oups 对这个例子感到抱歉。我刚刚拿了一个没有 UTF-8 字符的坏的 :p 不管...我的 application.rb 中有 config.encoding = "utf-8" 和我的 environment.rb 中有 Encoding.default_external = Encoding::UTF_8。谢谢:)
    • 很难确定不兼容数据的来源。我会尝试根据数据源将您的模板一分为二。所以尝试一个仅包含 I18n 内容的模板,另一个仅包含 I18n 内容的模板来自数据库的数据,如果你有一个缓存,则相同,等等。如果你使用 MySQL,然后尝试切换到 mysql2 驱动程序并确保 config/database.yml 指定编码:utf-8
    • 谢谢 :) 好的,我检查并可以从 MySQL 数据库中获取并显示 i18n 字符串。但我无法从 i18n 文件中获取字符串,到目前为止,我没有使用缓存。
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多