处理rails操作中传入的已发布(非UTF-8编码)数据

时间:2012-12-03 13:13:17

标签: ruby-on-rails-3 character-encoding

鉴于在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 "}

1 个答案:

答案 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

然后这可能是一个过滤器。

如果您有嵌套参数,或者您想查看帖子请求参数中给出的编码,那么它会更复杂一些。