2011-03-07 49 views
15

我使用Ruby 1.9.2,Rails 3.0.4/3.0.5和Phusion Passenger 3.0.3/3.0.4。我的模板是用HAML编写的,我使用的是MySQL2 gem。我有一个控制器动作,当通过具有特殊字符,如变音参数,使我有以下错误:ActionView :: Template :: Error(不兼容的字符编码:UTF-8和ASCII-8BIT)

ActionView::Template::Error (incompatible character encodings: UTF-8 and ASCII-8BIT) 

错误指向我的HAML模板的第一线,它具有以下代码它:

<!DOCTYPE html> 

我的理解是,这是因为我有正接受ASCII-8BIT串级联一个UTF-8字符串引起的,但我不能为我的生活找不出什么ASCII-8BIT字符串是。我已经检查过动作中的参数是使用UTF-8编码的,并且我已经在HAML模板和ruby文件的顶部添加了一个编码:UTF-8声明,并且仍然出现此错误。我的application.rb中的文件中有一个config.encoding = "UTF-8"声明以及所有结果在UTF-8如下:

ENV['LANG'] 
__ENCODING__ 
Encoding.default_internal 
Encoding.default_external 

这里的踢球者:我不能在本地在我的Mac-OSX使用独立旅客或杂种重现这一结果在开发或生产中。我只能在Linux上运行nginx + passenger的生产服务器上重现它。我已经在生产服务器的控制台中验证了后者提到的所有命令都以UTF-8格式生成。

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

回答

12

在做了一些调试之后,我发现使用ActionDispatch :: Request对象的时候会发生这个问题,而这个对象碰巧有所有以ASCII-8BIT编码的字符串,无论我的应用程序是用UTF-8编码还是不用。我不知道为什么只在Linux上使用生产服务器时才会发生这种情况,但我会认为这是Ruby或Rails中的一些怪癖,因为我无法在本地重现此错误。具体地发生,因为像这样的行的错误:

@current_path = request.env['PATH_INFO'] 

当该实例变量的HAML模板印刷,因为在字符串在ASCII-8BIT编码UTF-8而不是导致错误。为了解决这个问题,我做了以下内容:

@current_path = request.env['PATH_INFO'].dup.force_encoding(Encoding::UTF_8) 

迫使@current_path使用已被迫进入正确的UTF-8编码复制字符串。与其他请求相关的数据(如request.headers)也会发生此错误。

+0

有同样的错误,我想知道为什么这是在生产Nginx /乘客发生。它正在正确设置LC_All。但请求.env是ASCII。在本地服务器上,它的utf-8k – 2014-12-18 18:12:49

+0

在乘客https://github.com/phusion/passenger/issues/1328上添加了一个问题 – 2014-12-19 11:30:05

9

Mysql可能是麻烦的ascii的来源。尝试把以下的初始化至少消除了这种可能性:

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宝石。适用于MySQL但是。

+0

我知道这个解决方案,但它的目标是MySQL的宝石不是mysql2宝石。 Mysql2没有这个问题。另外,不管我是否查询数据库,我都会得到相同的结果。 – 2011-03-08 18:09:16

+0

我遇到了同样的问题。这解决了这个问题,谢谢。 – Xaqq 2013-01-16 17:27:47

相关问题