用Javascript读取中文COOKIE的解决办法


Posted in Javascript onFebruary 15, 2007

在Cookie的使用中,我们发现这样一个问题:如果写入Cookie的内容是中文(如用户称呼),用服务器端程序(如ASP或PHP)读出完全正确,但是用一般的javascript或VBScript的读Cookie函数取出的却是一堆乱码。这是一个棘手的问题,因为在有些情况下,Cookie的内容需要在客户机端用脚本语言读取。如果你写入了中文,得到了一堆乱码,是不是感觉很别扭呢?解决这个问题,还要从Cookie的存取方式说起。 

我们知道,写入Cookie内容前需要进行escape(十六进制编码),编码时又是以字节为单位的,这就是问题的关键所在:任何一个汉字都会被拆成两个字节分别编码;而在读Cookie时,unescape又以字节单位解码,因此最后每个汉字都变成了两个字节的乱码。怎么办呢?ASP或PHP方式能够正确读出,应该是在unescape解码后,又按照unicode编码把其中的汉字拼了出来。如果这样的话,能不能找到一种变通的方法解决这个问题呢?仔细研究后发现,只要在十六进制codec(编解码)过程中能够保存汉字信息就行了,因而我们需要再外包一层codec过程,方案如下: 

1.在escape编码前,把Cookie字符串中的每个字符转换为unicode码的字符串形式(用一特殊字符作为字串的分隔符)。 

2.在unescape解码后,先把所有unicode字串提取出来,再用对应的函数转换为原字符。 

<SCRIPT LANGUAGE=javascript>   
<!--   
//编码程序:   
function CodeCookie(str)   
{   
 var strRtn="";    for (var i=str.length-1;i>=0;i--)   
 {   

strRtn+=str.charCodeAt(i);   

if (i) strRtn+="a"; //用a作分隔符   
 }   
 return strRtn;   
}   
//解码程序:   
function DecodeCookie(str)   
{   
 var strArr;   
 var strRtn="";   
 strArr=str.split("a");   
 for (var i=strArr.length-1;i>=0;i--)   
 strRtn+=String.fromCharCode(eval(strArr[i]));   
 return strRtn;   
}   
//-->   
</script>  

VBScript版程序如下: 

<SCRIPT LANGUAGE=vbscript>   
<!--   
"编码程序:   
function CodeCookie(str)   
Dim i   
Dim strRtn   for i=len(str) to 1 step -1   
strRtn=strRtn & ascw(mid(str,i,1))   
if (i<>1) then strRtn = strRtn & "a" "用a作分隔符   
next   
CodeCookie=strRtn   
end function   
"解码程序:   
function DecodeCookie(str)   
Dim i   
Dim strArr,strRtn   
strArr=Split(str,"a");   
for i=UBound(strArr)-LBound(strArr) to 1 step -1   
strRtn=strRtn & chrw(Val(strArr(i)))   
next   
DecodeCookie=strRtn   
end function   
-->   
</script>  

例如你要写入的Cookie内容是"一顶abc",经过CodeCookie变为"99a98a97a-31029a26432a"(基于安全考虑,将字符串反转),再经过escape编码后变为"99a98a97a%2D31029a26432a"(escape编码将除字母和数字以外的字符转换为十六进制%XX的形式),注意分隔符不能选%,D和数字。当然,如果有类似密码的重要信息,还需要在加密上再强化一下。因为写入Cookie的一般都是短信息,编码后增加的一些字节可忽略不计。下面的javascript读写Cookie函数中就加入了以上的中文支持。 

function SetCookie(name,value,expires) 

 var exp=new Date(); 
 exp.setTime(exp.getTime()+expires*60*1000); 
 documents.cookie=name+"="+escape(CodeCookie(value))+" ; expires="+exp.toGMTString()+" ; path=/"; 

function GetCookie (name) 

 var strArg=name+"="; 
 var nArgLen=strArg.length; 
 var nCookieLen=documents.cookie.length; 
 var nEnd; 
 var i=0; 
 var j; 

while (i<nCookieLen) 

 j=i+nArgLen; 
 if (documents.cookie.substring(i,j)==strArg) 

 nEnd=documents.cookie.indexOf (";",j); 
 if (nEnd==-1) nEnd=documents.cookie.length; 
 return DecodeCookie(unescape(documents.cookie.substring(j,nEnd))); 

 i=documents.cookie.indexOf(" ",i)+1; 
 if (i==0) break; 

 return null; 

如果用CGI程序写入中文Cookie,客户端读取。如在ASP里,可以先使用前述的编码函数后,再用response写入,例如:response.cookies("Name")=CodeCookie("张三")至此,中文Cookie的问题基本解决。

Javascript 相关文章推荐
WEB高性能开发之疯狂的HTML压缩
Jun 19 Javascript
点击隐藏页面左栏或右栏实现js代码
Apr 01 Javascript
实测jquery data()如何存值
Aug 18 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
Jan 07 Javascript
JavaScript立即执行函数的三种不同写法
Sep 05 Javascript
jQuery隐藏和显示效果实现
Apr 06 Javascript
node.js中express-session配置项详解
May 31 Javascript
如何理解Vue的render函数的具体用法
Aug 30 Javascript
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
Vue 实现树形视图数据功能
May 07 Javascript
JS Array.from()将伪数组转换成数组的方法示例
Mar 23 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
Jun 24 Javascript
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
Feb 15 #Javascript
实例:用 JavaScript 来操作字符串(一些字符串函数)
Feb 15 #Javascript
从Ajax到JQuery Ajax学习
Feb 14 #Javascript
JAVASCRIPT对象及属性
Feb 13 #Javascript
js判断浏览器的比较全的代码
Feb 13 #Javascript
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Feb 09 #Javascript
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
Feb 09 #Javascript
You might like
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP实现的日历功能示例
2018/09/01 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
js实现点击烟花特效
2020/10/14 Javascript
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
django中ImageField的使用详解
2020/12/21 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
应聘编辑职位自荐信范文
2014/01/05 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
会议室标语
2014/06/21 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
会计试用期自我评价
2015/03/10 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
亲情作文之母爱
2019/09/25 职场文书