cookie 中文編碼問題

http 協議

   根據 RFC2616 ,一個 http 請求/響應可以分爲三段

 

狀態行

頭區域

體區域

 

其中狀態行和頭區域只能包含 ascii(iso8859-1 ) 編碼的字符,而 cookie 恰恰屬於頭區域,那麼要想使得 cookie 承載中文字符,則要進行編碼,使得編碼後的字符在 ascii 字符範圍內。

服務器編碼:

一般來說有三種

Base64

服務器端通過

 

new BASE64Encoder().encode(x.getBytes("utf-8"))

 

來編碼。

URLEncoder

一般用來當 content-type 爲 application/x-www-form-urlencoded 時對 html body 體進行編碼,編碼後字符在 ascii 範圍內,那麼也就可以用來編碼 cookie 值信息。

 

URLEncoder.encode(x,"utf-8")
 

注意:一定要編碼爲 utf-8,這樣可以方便客戶端 javascript 解碼。

Unicode

由於 java 與 javascript 內部都是用 unicode 來表示字符,故可以直接使用 unicode 編碼中文字符(英文當然也可以):

 

static String unicode(char c) {
		String str=Integer.toHexString((int)c);
		while (str.length() < 4) {
			str = "0" + str;
		}
		return "\\u" + str;
}

 

客戶端解碼:

對應編碼可用 base64decodeURIComponent

 

unicode 傳到客戶端讀出後,假設存在變量 v 中爲 "\\u6211" (注意不是 \u6211 ,否則就不需要解碼了),解碼方法其實也挺多:

escape

已經不太推薦 了,(詳細 : 不能 escape '+' ,非 ascii 字符 escape 後不是合適的 form data 格式),用做 cookie 解碼的話也可以:

 

unescape("\\u6211\\u6211".replace(/\\u([0-9]{4,5})/g,"%u$1"));

自己解碼:

var re=[];
"\\u6211\\u6211".replace(/\\u([0-9]{4,4})/g,function(m,g){
  re.push(String.fromCharCode(parseInt(g,16)));
});
alert(re.join(""));

 eval

更巧妙的是可以利用 eval 進行自動解碼(實質是轉義的作用):

 

eval("'"+"\\u6211\\u6211"+"'")

new Function

但是 eval is evil ,那麼可以用 new Function :

 

new Function("return '"+"\\u6211\\u6211"+"'")();

json parser

或者最想不到的就是可以直接用 json parser :

 

JSON.parse('{"v":"'+"\\u6211\\u6211"+'"}').v;

 

安全高效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章