請求參數 URL 編碼
Rails 3.1 中設定 application.rb 中的 config.encoding 為 Big5 時,請求參數一定得是 UTF-8 的 URL 編碼才行嗎?
舉例來說,設定 config.encoding 為 UTF-8 時,請求參數若是Big5的「測」URL編碼,也就是編碼為%B4%FA,則Controller中取得的請求參數字串為UTF-8編碼,但是事實上位元組序列還是b4 fa,所以還有機會轉回正確的UTF-8字串。
設定 config.encoding 為 Big5 時,請求參數若是Big5的「測」URL編碼,也就是編碼為%B4%FA,則Controller中取得的請求參數字串為Big5編碼,但是位元組序列還是63 63,所以就沒有機會轉回正確的Big5字串了?
是否有地方可以設定預設的請求參數URL編碼呢?或是Rails一定要採用UTF-8的URL編碼?
先自答一下...
在設定 config.encoding 為 Big5 時,請求參數若是Big5的「測」URL編碼,也就是編碼為%B4%FA,暫時想到,可以用request.query_string取得完整的查詢字串,再自己作URL解碼來得到Big5的「測」,不知道有沒有比較沒這麼笨的方法?
上 iconv 試看看?
如果params取得的字串位元組序列都是63,應該就不是 iconv 可以幫上忙了,還是說 Rails 有辦法讓 iconv 之類的程式庫,可以介入 Rails 對 URL 進行解碼的過程?或者是 Rails 本身有哪邊可以直接設定 URL 編碼的選項?
我想應該是要走 utf-8 編碼方案...
印象中 url 的 solution 都是針對 utf8 去 escape 的..
當然 UTF-8 一路到底是最省事的,不過要處理其它編碼的機會也是有的,之前客戶(維護為主)那邊就遇到不少要處理編碼的鳥事,無論如何,走別的路暫時倒也有一些心得:
http://caterpillar.onlyfun.net/Gossip/Rails/Encoding.html
Rails 目前還在學,有寫錯麻煩鞭一下:
http://caterpillar.onlyfun.net/Gossip/Rails/index.html
在客戶那邊的經驗,整理的一些編碼心得:
http://caterpillar.onlyfun.net/Gossip/Encoding/index.html
如果設定config/application.rb中config.encoding為UTF-8時,請求參數若是Big5的「測」URL編碼,也就是編碼為%B4%FA,則控制器中透過params取得的請求參數字串為UTF-8編碼,但是事實上位元組序列還是B4 FA,可以有機會轉回正確的UTF-8字串。例如若發送test=%B4%FA,可以如下取得正確的Big5編碼的「測」,再轉為UTF-8編碼的字串:
params[:test] = params[:test].force_encoding("big5").encode("UTF-8")
如果設定config/application.rb中config.encoding為Big5時,請求參數若是Big5的「測」URL編碼,也就是編碼為%B4%FA,則控制器中透過params取得的請求參數字串為Big5編碼,但是位元組序列還是63 63,所以沒有機會轉回正確的Big5字串,此時可透過query_string取得原始的查詢參數,如下處理:
# 假設查詢參數是test1=%B4%FA&test2=%B8%D5
require "cgi"
parameters = request.query_string.split("&") # ["test1=%B4%FA", "test2=%B8%D5"]
parameters.each do |parameter|
p = parameter.split("=")
params[p[0]] = CGI.unescape(p[1], "big5")
end
這邊透過CGI模組中的unescape方法來解碼URL,params[:test1]就會是正確的Big5編碼「測」字,params[:test2]就會是正確的Big5編碼「試」字。
不用這麼麻煩,怎麼轉都會有問題,搞的自己一肚鳥毛
試試看
1.將controller頁面編碼為url參數編碼
2.要寫進DB前再使用iconv轉碼