2010-04-01 37 views
3

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

通过Rack::Utils.parse_query('query=M%E9xico')传递这个你得到一个哈希,{"query" => "M?xico"}

当你的东西“M?exico”到Postgres的(但不是更多的宽容SQLite的),它pukes因为字符串是不妥当的UTF-8 。看着http://rack.rubyforge.org/doc/Rack/Utils.html#M000324,unescape正在打包一个十六进制字符串。

如何将字符串转换回UTF-8,或者我能否首先获取parse_query返回UTF-8。

+2

信息已经打破了日志中:%E9表明它是不是UTF-8。如果不假设初始字符集是什么,就不能对其进行转换。 – 2010-04-01 02:17:26

回答

0

这里的问题发生在您掌握数据之前。如果可以的话,你需要解决上游问题,如果你不能,那么我的建议是找到编码并将其转换为输入或使用Ruby中的转换库(例如iconv)。

虽然这个问题不在PostgreSQL中。

1

UNESCAPE将解码URL编码:

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

或者

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