用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 相关文章推荐
杨氏矩阵查找的JS代码
Mar 21 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
Apr 25 Javascript
instanceof和typeof运算符的区别详解
Jan 06 Javascript
jquery mobile 移动web(5)
Dec 20 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
May 22 Javascript
jQuery实现可兼容IE6的滚动监听功能
Sep 20 jQuery
vue配置请求本地json数据的方法
Apr 11 Javascript
Angular父子组件通过服务传参的示例方法
Oct 31 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
Jan 23 Javascript
node中使用es6/7/8(支持性与性能)
Mar 28 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
Jul 28 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伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
js 省地市级联选择
2010/02/07 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
在Python中使用__slots__方法的详细教程
2015/04/28 Python
Python读写ini文件的方法
2015/05/28 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
斯福泰克软件测试面试题
2015/02/16 面试题
应届生如何写自荐信
2014/01/05 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
法律七进实施方案
2014/03/15 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
南湾猴岛导游词
2015/02/09 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
党员证明信
2015/06/19 职场文书
初中语文教学随笔
2015/08/15 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Vue的过滤器你真了解吗
2022/02/24 Vue.js
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers