用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 相关文章推荐
关于IFRAME 自适应高度的研究
Jul 20 Javascript
addRule在firefox下的兼容写法
Nov 30 Javascript
jQuery 拖动层(在可视区域范围内)
May 24 Javascript
jquery()函数的三种语法介绍
Oct 09 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
Apr 20 Javascript
JS获取网页图片name属性的方法
Apr 01 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
Aug 31 Javascript
基于模板引擎Jade的应用(详解)
Dec 12 Javascript
Node实战之不同环境下配置文件使用教程
Jan 02 Javascript
node(koa2) web应用模块介绍详解
Mar 29 Javascript
VUE前后端学习tab写法实例
Aug 06 Javascript
js tab栏切换代码实例解析
Sep 03 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
PHP5 面向对象程序设计
2008/02/13 PHP
php 中文和编码判断代码
2010/05/16 PHP
php防攻击代码升级版
2010/12/29 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
JS查看对象功能代码
2008/04/25 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
python:接口间数据传递与调用方法
2018/12/17 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
python numpy 反转 reverse示例
2019/12/04 Python
python 实现字符串下标的输出功能
2020/02/13 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
Python如何实现单例模式
2016/06/03 面试题
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
技术总监岗位职责
2013/12/05 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
第二课堂活动总结
2014/05/07 职场文书
收银员岗位职责
2015/02/03 职场文书
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python