我有一个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,但我想知道发生了什么。
提前致谢。
问候,
雅各
答案 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") %>" />
我希望它有所帮助。