2010-04-01 65 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'))