我使用的是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 (incompatible character encodings: UTF-8 and ASCII-8BIT)
<!DOCTYPE html>
我的理解是,这是因为我有一个UTF-8字符串连接与ASCII-8BIT字符串,但我不能为我的生活找出什么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乘客的生产服务器上复制它.我已经在生产服务器的控制台中验证了后者所提到的命令都是UTF-8.
解决方法
在进行一些调试后,我发现使用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)发生.