HTML编码UTF-8字符串被破坏成latin1

时间:2010-04-01 02:12:52

标签: ruby-on-rails postgresql rack

我正在解析我的nginx日志,我想从HTTP_REFERER字符串中发现一些细节,例如,用于查找网站的查询字符串。一个用户输入“México”,在日志中编码为“query = M%E9xico”。

通过Rack::Utils.parse_query('query=M%E9xico')传递此内容,您会得到一个哈希值{"query" => "M?xico"}

当你把“M?exico”填充到Postgres(但不是更宽容的SQLite)时,它会因为字符串不正确的UTF-8而呕吐。看http://rack.rubyforge.org/doc/Rack/Utils.html#M000324,unescape正在打包一个十六进制字符串。

如何将字符串转换回UTF-8,或者我可以让parse_query首先返回UTF-8。

2 个答案:

答案 0 :(得分:1)

unescape将解码URL编码:

Rack::Utils.parse_query(URI.unescape('query=M%E9xico'))

或者

Rack::Utils.parse_query(Utils.unescape('query=M%E9xico'))

答案 1 :(得分:0)

这里的问题在您获得数据之前就已经发生了。你需要在上游修复问题,如果你不能,那么我的建议就是找出编码并在输入时转换它或者使用Ruby中的转换库(例如iconv)。

问题不在PostgreSQL中。