用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 DOM 操作实现代码
Aug 01 Javascript
jquery 操作表格实现代码(多种操作打包)
Mar 20 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
May 15 Javascript
Javascript控制页面链接在新窗口打开具体方法
Aug 16 Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
angular 动态组件类型详解(四种组件类型)
Feb 22 Javascript
Vue自定义指令使用方法详解
Aug 21 Javascript
如何更好的编写js async函数
May 13 Javascript
vue配置font-awesome5的方法步骤
Jan 27 Javascript
如何从头实现一个node.js的koa框架
Jun 17 Javascript
简述Vue中容易被忽视的知识点
Dec 09 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跳转页面的几种实现方法详解
2013/06/08 PHP
标准PHP的AES加密算法类
2015/03/12 PHP
如何将网页表格内容导入excel
2014/02/18 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
echart简介_动力节点Java学院整理
2017/08/11 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
python面试题小结附答案实例代码
2019/04/11 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
RealTek面试题
2016/06/28 面试题
物业管理求职自荐信
2013/09/25 职场文书
新闻专业应届生求职信
2013/10/31 职场文书
后勤主管工作职责
2013/12/07 职场文书
主题婚礼策划方案
2014/02/10 职场文书
前台岗位职责
2015/02/13 职场文书
期末个人总结范文
2015/02/13 职场文书
校园安全教育心得体会
2016/01/15 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
mysql的Buffer Pool存储及原理
2022/04/02 MySQL