Rails 3 - (不兼容的字符编码:UTF-8和ASCII-8BIT)

4

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

我发现关于这个错误信息的旧信息很多,但是关于它的建议很少,想知道当前情况如何,因为似乎在网络上对它的讨论越来越少了。当我尝试从包含重音字符(例如'é')的区域设置文件中呈现文本时,就会出现这个错误。

我正在使用rails 3.0.3、ruby 1.9.2(也尝试过1.8.7,结果相同)、mysql2适配器、utf8编码。


3
我不能代表Ruby回答,但基本上不存在8位ASCII。http://en.wikipedia.org/wiki/ASCII是一个7位编码,比特永远不被设置。"é"存在于*nix的8位编码,如http://en.wikipedia.org/wiki/ISO/IEC_8859-1,Windows编码,如http://en.wikipedia.org/wiki/Windows-1252,以及Apple Macintosh编码,如http://en.wikipedia.org/wiki/Mac_OS_Roman。在MacRoman中,它与其他两个位置不同,并且在UTF-8中需要两个字节。 - hippietrail
你有导致这个问题的原始电子邮件副本吗?我遇到了类似的情况,很想拥有一个好的测试电子邮件(由于某些比我愿意解释更复杂的原因,我无法获取那个对我而言失败的邮件)。 - jwg2s
3个回答

3

当我的Ruby应用程序解析字符串的方式与数据库存储字符串的方式不一致时,我会遇到这个错误。这是由编码不匹配引起的。

如果我正在处理UTF-8,我会确保在相关的.rb文件顶部加入以下内容来解决这个问题:

# encoding: utf-8

另外,你可以通过在应用配置文件中使用这行代码来全局设置默认的UTF-8编码:

Encoding.default_internal, Encoding.default_external = ['utf-8'] * 2

最后,我通过在database.yml中设置encoding选项来确保我的数据库内部使用UTF-8编码:

development:
  adapter: postgresql
  encoding: UTF8
  database: pg_development
  username: abe
  pool: 5

最终,我的问题是由静态I18n文件引起的,这些文件包含了一些插件Web界面放置的二进制数据,用于管理翻译。在您的i18n文件中查找day: !binary | RMOtYQ==等类似内容。 - mark

2

我记得曾经通过使用 "string".force_encoding("UTF-8") 来解决这个问题。


2

目前,这可能是由于Mail 2.5.4中的一个问题导致邮件对象的编码被“污染”。

@email = Email.find(1)
@email.body.encoding # This is a fresh instance from db, still okay
Mail.new(@email.body)
@email.body.encoding # value has been changed

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