ruby-on-rails – ActionView :: Template :: Error(不兼容的字符编码:UTF-8和ASCII-8BIT)

我使用的是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)

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

<!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)发生.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...