鉴于在Ruby 1.9上运行的rails 3.2 app:
我有传入的数据(从我无法控制的外部服务发布),该帖子带有使用ISO-8859-1编码的参数,并且没有在内容类型中指定编码(application / x- WWW窗体-urlencoded)。
根据HTTP1.1 specs,这可能被解释为有效但不受我的控制(如果他们在内容类型中指定编码,它肯定会100%有效)
但似乎rails 3 automatically assumes UTF-8。所以任何非ascii字符都给我错误。有什么好方法可以解决这个问题吗? (除了在检查中进行黑客攻击和重新转换之外?)
PS:如果它有帮助,这里是一个调用错误的测试片段:
post "incoming", {'content'=>"some content with a pound-sterling sign encoded like this: \xA3 "}
答案 0 :(得分:1)
这是我的专业答案(鉴于在我的情况下,我总是知道源代码将对8859-1进行编码,而且我只有一个重要的参数):
params['content'].force_encoding('iso-8859-1').encode!
然而,这可以针对所有参数(到一个深度)进行
def params_to_iso_8859_1
params.each_value{|v| v.force_encoding('iso-8859-1').encode! if v.respond_to(:force_encoding)}
end
然后这可能是一个过滤器。
如果您有嵌套参数,或者您想查看帖子请求参数中给出的编码,那么它会更复杂一些。