用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 相关文章推荐
ExtJs使用IFrame的实现代码
Mar 24 Javascript
Javascript 面向对象之重载
May 04 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
Feb 27 Javascript
jquery入门—访问DOM对象方法
Jan 07 Javascript
js验证输入是否为手机号码或电话号码示例
Dec 30 Javascript
jQuery中get()方法用法实例
Dec 27 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
Dec 01 Javascript
node.js实现复制文本到剪切板的功能
Jan 23 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
Mar 07 Javascript
React Native中TabBarIOS的简单使用方法示例
Oct 13 Javascript
JS中的变量作用域(console版)
Jul 18 Javascript
Element Popover 弹出框的使用示例
Jul 26 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
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
python操作MySQL数据库具体方法
2013/10/28 Python
Python中的choice()方法使用详解
2015/05/15 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
Python坐标线性插值应用实现
2019/11/13 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
2013年高中生自我评价
2013/10/23 职场文书
建筑专业毕业生推荐信
2013/11/21 职场文书
元旦寄语大全
2014/04/10 职场文书
银行求职信范文
2014/05/26 职场文书
母亲节演讲稿
2014/05/27 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
不错的求职信范文
2014/07/20 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL