cookie 中文编码问题
by
at 2011-02-16 19:33:07
original http://yiminghe.javaeye.com/blog/908141
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; }
客户端解码:
对应编码可用 base64 ,decodeURIComponent 。
unicode 传到客户端读出后,假设存在变量 v 中为 "\\u6211" (注意不是 \u6211 ,否则就不需要解码了),解码方法其实也挺多:
escape
已经不太推荐 了,(详细 ),用做 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;
安全高效
<br><br>
<span style="color:red">
<a href="http://yiminghe.javaeye.com/blog/908141#comments" style="color:red">已有 <strong>2</strong> 人发表留言,猛击->><strong>这里</strong><<-参与讨论</a>
</span>
<br><br><br>
JavaEye推荐