Charset和POST请求

时间:2010-03-26 12:09:41

标签: ruby-on-rails character-encoding http-headers

我有一个Rails 2.3.5应用程序,可以正常使用UTF-8和国际字符。现在我已经对支付网关进行了一些集成,在那里我发布一些数据,等待一段时间然后回来。问题是,当我收到该帖子时,国际字符被破坏了。我得到的不是“sørensen”,而是“sørensen”。如果我执行“iconv -t ISO-8859-1 -f UTF8”,它会被正确转换为前者(我从OS X命令提示符执行此操作)。我已经在我的控制器中使用logger.info(request.headers.inspect)检查了POST请求,我可以看到没有给出charset参数。

来自网关的POST应该是ISO-8859-1 - 这是Rails认为它是UTF8的问题吗?这跟我看到的问题一致吗?

我知道一个解决方案是简单地将params-hash转换为控制器中的Iconv,但我想知道发生了什么。

提前致谢。

问候,

雅各

2 个答案:

答案 0 :(得分:0)

可以验证POST中是否正确设置了请求标头。您可以在以下链接中看到可接受的值。 http://en.wikipedia.org/wiki/List_of_HTTP_headers

答案 1 :(得分:0)

我最终这样做了:

在模型中:

FIELDS_TO_FIX=[:name, :city, :address]  

# DIBS sucks and sends UTF8 in some strange encoding. So we have to do an array.pack on
# strings when posting to DIBS and unpack them at callback.
#
def self.fix_encoding(params)  
  FIELDS_TO_FIX.each do |f|
    next if params[f].nil?
    params[f]=params[f].unpack("M")[0].force_encoding("UTF-8")
  end
  params
end

在控制器的创建操作中:

  params[:booking]=Booking.fix_encoding(params[:booking])

并且在发布到外部资源的视图中:

<input type="hidden" name="booking[name]" value="<%= [@booking.name].pack("M") %>" />

我希望它有所帮助。