Ruby on Rails 3,不兼容的字符编码:UTF-8和ASCII-8BIT与i18n

34

我在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(http://railscasts.com/episodes/256-i18n-backends)。如果有人在2011年3月6日那周看到这条评论,那么从某种程度上来说,这条评论对你来说是相关的。 - aarona
2
James在他的博客上有一个非常好的教程,涵盖了Ruby 1.9中字符串编码的几乎所有方面。要了解“外部”和“内部”编码的含义,请阅读以下链接:http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings - Nicolas
这是一个关于Rails编码的精彩解释:http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails - B Seven
5个回答

47

经过几个小时的搜索后,问题终于解决了...

实际上我的代码中有两个错误。第一个是文件编码错误,第二个是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

希望这能帮到某些人 :)


2
非常感谢!我遇到了同样的问题,除了我使用的是mysql gem而不是mysql2之外,其他都没问题。 - Amokrane Chentir
1
同样的情况也发生在我身上,但我只注意到当源代码文件中有一个有趣的'字符时。我的gemfile文件中有mysql和mysql2两个宝石,我不得不删除旧的mysql宝石。(并修改我的database.yml文件) - DGM
1
兄弟,你救了我的一天,甚至可能是一周!谢谢! - zigomir
1
我在使用Rails缓存时遇到了相同的错误。这是我的问题链接:http://stackoverflow.com/questions/11114872/rails-character-encoding-issue-while-using-cache - MKumar
啊!谢谢!还必须升级到mysql2 gem并相应更新database.yml。这对我也起作用了。 - jpgeek
当我将一个字符串放入 Protocol Buffers 消息中时,在 Ruby 2.0.0p576 上出现了这个错误(但在 2.0.0 p481 上没有)。 - Paul

23

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

  • 确保application.rb文件中有这一行:config.encoding = "utf-8"
  • 确保你正在使用'mysql2'宝石。
  • 在任何包含UTF-8字符的文件顶部添加以下两行代码:# encoding: 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
这个答案:https://dev59.com/xW445IYBdhLWcg3wiq8i#4804802 有一个很好的方法来为所有的Ruby文件添加建议的# encoding: UTF-8 - William Denniss
1
我只在我的控制器的开头添加了 # encoding: utf-8,一切都很好。我使用的是 Ruby 1.9.3 上的 Rails 3.2.7。 - S.M.Mousavi
一个建议:mysql2 gem 只适用于 MRI Ruby,不要在 jruby 中使用它。 - Fernando Fabreti
这对我很有帮助,特别是 Encoding.default_external 部分。 - J.R.

0

你确定你的es.yml文件保存为UTF-8格式吗?

如果你使用的是Windows系统,请使用http://notepad-plus-plus.org/来确保保存为UTF-8格式。


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

抱歉,我的例子不太好,没有UTF-8字符:p 无论如何,我在我的application.rb中有config.encoding = "utf-8",并且在我的environment.rb中有Encoding.default_external = Encoding::UTF_8。谢谢 :) - Nicolas Guillaume
很难确定不兼容数据的来源。我建议你尝试根据数据源对模板进行二分法调试。因此,尝试使用仅包含I18n内容的模板,另一个仅包含来自数据库的数据的模板,如果有缓存,则同样如此。如果你正在使用MySQL,请尝试切换到mysql2驱动程序,并确保config/database.yml指定了编码:utf-8。 - noodl
好的,我检查过了,可以从MySQL数据库获取和显示i18n字符串。但是我无法从i18n文件中获取字符串,到目前为止,我也没有使用缓存。 - Nicolas Guillaume

0
使用这个解包函数帮助我最终解决了这个问题,如果你遇到“无法转换”错误消息,请尝试使用此方法:
myString.unpack('U*').pack('U*')

如果你必须对所有字符串都这样做,那听起来有点CPU昂贵和痛苦... - Nicolas Guillaume
希望我能得到其他选项来解决这个错误,但它们对我没有起作用。我还没有注意到任何CPU增加。 - flunder
我会稍后再尝试最佳答案的解决方案,只是为了确认,并回报结果。 - flunder
你的问题是来自于数据库中的字符还是视图文件中的字符? - Nicolas Guillaume
嘿,我还没找到时间 :/ 我在爬取数据时遇到了这个问题,只有在那时才会出现 ~ 所以在它进入任何数据库之前。 - flunder
可能会有所帮助,确保在您的HTML头部中包含元标记(例如使用HAML):%meta {'http-equiv' =>' content-type','content' => 'text / html; charset = utf-8'} 这样浏览器就知道这是utf-8编码的了。 - Nicolas Guillaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接