首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

cookie 中文编码有关问题

2012-10-11 
cookie 中文编码问题http 协议?? 根据 RFC2616 ,一个 http 请求/响应可以分为三段?状态行头区域体区域?其

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;}

?

客户端解码:

对应编码可用 base64,decodeURIComponent。

?

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;

?

安全高效

光测验就十几条!

static String unicode(char c) {
String str=Integer.toHexString((int)c);
while (str.length() < 4) {
str = "0" + str;
}
return "\\u" + str;
}
这段代码 不是js代码吧?

编码问题 以前也遇见过一次  base64 unicode escape 都试了 问题是 中文的个数 是偶数 就没问题 是奇数 就错误 后来实在不行就放弃了  好像是  在 ajax应用中 出现的 问题 2 楼 yiminghe 2011-02-17   peiran102 写道
这段代码 不是js代码吧?


服务器端 java 编码

热点排行