我的Rails 3.2.2/1.9.3的Ruby應用程序獲取搜索請求,如:確定字符編碼的Ruby 1.9.3
http://booko.com.au/books/search?q=Fran%E7ois+Vergniolle+de+Chantal
的Ruby/Rails藉此查詢並對其進行解碼 - 但假定它是UTF- 8。在某些時候,我得到一個:
invalid byte sequence in UTF-8
app/models/product.rb:694:in `upcase'
我認爲這是做這樣的事情:
q="Fran%E7ois+Vergniolle+de+Chantal"
=> "Fran%E7ois+Vergniolle+de+Chantal"
CGI.unescape(q)
=> "Fran\xE7ois Vergniolle de Chantal"
CGI.unescape(q).encoding.name
=> "UTF-8"
CGI.unescape(q).valid_encoding?
=> false
什麼是處理這個問題的正確方法是什麼?我想將其轉碼爲正確的編碼 - 但我如何確定當前編碼?我目前在做什麼,只是假設它是LATIN1:
q.encode!("ISO-8859-1", "UTF-8", :invalid => :replace, :undef => :replace, :replace => "")
或做一些事情我在博客上某處發現:
q = q.unpack('C*').pack('U*')
什麼是處理這個問題的正確方法?
編輯 服務器正在向客戶端正確發送「Content-Type:text/html; charset = utf-8」標頭。該頁面還包含適當的元標記:'meta http-equiv =「content-type」content =「text/html; charset = UTF-8」'
不確定是否有另一種方法告訴客戶端哪些編碼使用?
如果在'app/models/product.rb'的頂部寫'#coding:UTF-8'會怎麼樣?我認爲它應該解決這個錯誤。你會滿意這個解決方案嗎? – ck3g 2012-03-21 06:50:11
@ ck3g,不,這不是關於文件編碼。 – fl00r 2012-03-21 08:11:37
您將不得不使用某種字典來確定正確的編碼,因爲相同的字節0xE7可能(而且確實是)除Latin1以外的其他編碼中的有效字符。 – 2012-03-21 08:15:54