x無法存取,你可能沒有權限或未登入。
1e775503661398f19fa3be399df2e455

請求參數 URL 編碼

2011-12-21 09:06:19 +0800caterpillarRuby on Rails 節點 中發起
最後由 imx2011-12-24 15:58:55 +0800回應 , 381次閱讀

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編碼?

截至 2011-12-24 15:58:55 +0800,共收到 7 條回應
1e775503661398f19fa3be399df2e455
caterpillar 1樓, 於2011-12-21 11:25:07 +0800回應

先自答一下...

在設定 config.encoding 為 Big5 時,請求參數若是Big5的「測」URL編碼,也就是編碼為%B4%FA,暫時想到,可以用request.query_string取得完整的查詢字串,再自己作URL解碼來得到Big5的「測」,不知道有沒有比較沒這麼笨的方法?

19e786a2a74377ff6e052d87fd8d1fa8
xdite 2樓, 於2011-12-21 13:32:30 +0800回應

上 iconv 試看看?

1e775503661398f19fa3be399df2e455
caterpillar 3樓, 於2011-12-21 16:24:45 +0800回應

如果params取得的字串位元組序列都是63,應該就不是 iconv 可以幫上忙了,還是說 Rails 有辦法讓 iconv 之類的程式庫,可以介入 Rails 對 URL 進行解碼的過程?或者是 Rails 本身有哪邊可以直接設定 URL 編碼的選項?

19e786a2a74377ff6e052d87fd8d1fa8
xdite 4樓, 於2011-12-21 16:45:12 +0800回應

我想應該是要走 utf-8 編碼方案...

印象中 url 的 solution 都是針對 utf8 去 escape 的..

1e775503661398f19fa3be399df2e455
caterpillar 5樓, 於2011-12-21 17:26:58 +0800回應

當然 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

1e775503661398f19fa3be399df2e455
caterpillar 6樓, 於2011-12-23 16:42:22 +0800回應

如果設定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編碼「試」字。

Ad3b3f4835b8746b50f3eb89a7843174
imx 7樓, 於2011-12-24 15:58:55 +0800回應

不用這麼麻煩,怎麼轉都會有問題,搞的自己一肚鳥毛
試試看
1.將controller頁面編碼為url參數編碼
2.要寫進DB前再使用iconv轉碼

需要 登入 後方可回應,如果你還沒有帳號按這裡 註冊