首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionView::Template::Error (不兼容的字符编码: UTF-8和ASCII-8位)

ActionView::Template::Error (不兼容的字符编码: UTF-8和ASCII-8位)
EN

Stack Overflow用户
提问于 2011-03-07 15:07:47
回答 2查看 10.7K关注 0票数 15

我使用的是Ruby 1.9.2,Rails 3.0.4/3.0.5和Phusion Passenger 3.0.3/3.0.4。我的模板是用HAML编写的,我使用的是MySQL2 gem。我有一个控制器操作,当传递一个具有特殊字符的参数时,会产生以下错误:

代码语言:javascript
复制
ActionView::Template::Error (incompatible character encodings: UTF-8 and ASCII-8BIT)

错误指向我的HAML模板的第一行,其中包含以下代码:

代码语言:javascript
复制
<!DOCTYPE html>

我的理解是,这是因为我有一个正在与ASCII-8位字符串连接的UTF-8字符串,但我无论如何也找不出那个ASCII-8位字符串是什么。我检查了动作中的参数是否使用UTF-8编码,并且在HAML模板和ruby文件的顶部添加了一个编码: UTF-8声明,但我仍然收到此错误。我的application.rb文件中也有一个config.encoding = "UTF-8"声明,下面所有的结果都是UTF-8格式的:

代码语言:javascript
复制
ENV['LANG']
__ENCODING__
Encoding.default_internal
Encoding.default_external

要点是:无论是在开发中还是在生产中,我都不能在我的Mac-OSX上使用独立的passenger或mongrel在本地重现这个结果。我只能在linux上运行nginx+passenger的生产服务器上重现它。我已经在生产服务器的控制台中验证了后者提到的所有命令也都使用UTF-8。

你经历过同样的错误吗?你是如何解决它的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-09 05:15:07

在做了一些调试之后,我发现这个问题是在使用ActionDispatch::Request对象时出现的,该对象恰好包含全部以ASCII-8位编码的字符串,而不管我的应用程序是否以UTF-8编码。我不知道为什么只有在Linux上使用生产服务器时才会发生这种情况,但我假设这是Ruby或Rails中的某种怪癖,因为我无法在本地重现此错误。错误发生的原因特别是下面这样的一行:

代码语言:javascript
复制
@current_path = request.env['PATH_INFO']

当在HAML模板中打印此实例变量时,它会导致一个错误,因为字符串是以ASCII-8位而不是UTF-8编码的。为了解决这个问题,我做了以下工作:

代码语言:javascript
复制
@current_path = request.env['PATH_INFO'].dup.force_encoding(Encoding::UTF_8)

这迫使@current_path使用被强制为正确的UTF-8编码的重复字符串。其他与请求相关的数据(如request.headers )也可能出现此错误。

票数 12
EN

Stack Overflow用户

发布于 2011-03-08 22:39:34

Mysql可能是麻烦的ascii的来源。尝试将以下内容放入初始值设定项中,以至少消除这种可能性:

代码语言:javascript
复制
require 'mysql'

class Mysql::Result
  def encode(value, encoding = "utf-8")
    String === value ? value.force_encoding(encoding) : value
  end

  def each_utf8(&block)
    each_orig do |row|
      yield row.map {|col| encode(col) }
    end
  end
  alias each_orig each
  alias each each_utf8

  def each_hash_utf8(&block)
    each_hash_orig do |row|
      row.each {|k, v| row[k] = encode(v) }
      yield(row)
    end
  end
  alias each_hash_orig each_hash
  alias each_hash each_hash_utf8
end

编辑

这可能不适用于mysql2 gem。不过,它适用于mysql。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5216822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档