1

给定一个在 Ruby 1.9 上运行的 rails 3.2 应用程序:

我收到了传入的数据(从我无法控制的外部服务发布),这些数据来自一个帖子,其中的参数用 ISO-8859-1 编码,内容类型中没有指定编码(application/x-www-form -urlencoded)。

根据HTTP1.1 规范,这可以解释为有效,但我无法控制(如果他们在内容类型中指定编码,它肯定是 100% 有效的)

但是,rails 3 似乎自动假定为 UTF-8。所以任何非ASCII字符都会给我错误。有什么好的方法可以解决这个问题吗?(不仅仅是在检查中进行黑客攻击并在操作中重新转换?)

PS:如果有帮助,这是一个调用错误的测试片段:

  post "incoming", {'content'=>"some content with a pound-sterling sign encoded like this: \xA3 "}
4

1 回答 1

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

这可能是一个过滤器。

如果您有嵌套参数,或者如果您想查看帖子请求参数中给出的编码,则涉及更多。

于 2012-12-03T14:39:08.187 回答