客户端Cookie中文编程

原创 2000年12月19日 02:19:00

客户端Cookie中文编程
2000-11-28·  ·YESKY

------------------------------------------------------------------------------- -

  在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>
<!--
file://编码程序:
function CodeCookie(str)
{
 var strRtn="";

 for (var i=str.length-1;i>=0;i--)
 {
  strRtn+=str.charCodeAt(i);
  if (i) strRtn+="a"; file://用a作分隔符
 }
 return strRtn;
}

file://解码程序:
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;
}
file://-->
</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);
 document.cookie=name+"="+escape(CodeCookie(value))+" ;  expires="+exp.toGMTString()+" ; path=/";
}

function GetCookie (name)
{
 var strArg=name+"=";
 var nArgLen=strArg.length;
 var nCookieLen=document.cookie.length;
 var nEnd;
 var i=0;
 var j;

while (i<nCookieLen)
{
 j=i+nArgLen;
 if (document.cookie.substring(i,j)==strArg)
{
 nEnd=document.cookie.indexOf (";",j);
 if (nEnd==-1) nEnd=document.cookie.length;
 return DecodeCookie(unescape(document.cookie.substring(j,nEnd)));
}
 i=document.cookie.indexOf(" ",i)+1;
 if (i==0) break;
}
 return null;
}


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

客户端Cookie中文编程(上)

Cookie的使用中,我们发现这样一个问题:如果写入Cookie的内容是中文(如用户称呼),用服务器端程序(如ASP或PHP)读出完全正确,但是用一般的JavaScript或VBScript的读Coo...
  • swdzx
  • swdzx
  • 2007年03月18日 15:28
  • 357

客户端Cookie中文编程(下)

例如你要写入的Cookie内容是"一顶abc",经过CodeCookie变为"99a98a97a-31029a26432a"(基于安全考虑,将字符串反转),再经过escape编码后变为"99a98a9...
  • swdzx
  • swdzx
  • 2007年03月18日 15:29
  • 336

解决cookie中文乱码(登录的记住用户功能)

第一步:在处理登录的servlet中把中文名字编码为utf-8,然后存入cookie中 第二步:是在jsp页面中解码,有两种方法 方法一:自定义EL函数 *先编写一个处理...
  • Howinfun
  • Howinfun
  • 2017年01月04日 09:42
  • 591

客户端Cookie的设置——可完成记住密码的操作

先只贴出实现此功能的基础知识代码: demo07
  • Songjs19931206
  • Songjs19931206
  • 2014年07月23日 20:25
  • 1392

在客户端使用js操作cookie

代码一 var caution=false function setCookie(name,value,expires,path,domain,secure) { var curCookie=na...
  • qq_35661734
  • qq_35661734
  • 2016年09月22日 18:20
  • 202

cookie中保存中文与取出中文

jsp中的cookie这个小点心,有时,确实给我们带来不少的方便,但如果要用它来存贮中文可能有忙烦。要进行编码与解码。如下所示:String name = request.getParameter("...
  • licip
  • licip
  • 2010年01月02日 12:20
  • 12048

Java中的cookie(3)——cookie中存取中文

// 模拟Cookie Cookie cookie1 = new Cookie("num", "001"); Cookie cookie2 = new Cookie("name", URLEncode...
  • woshixuye
  • woshixuye
  • 2014年01月19日 20:07
  • 5998

cookie写入中文出错解决办法

环境:tomcat7,Java7当cookie写入中文会引发异常。所以这样看来Cookie默认支持的编码方式是ASCII码。不能对中文进行编码和解码。解决办法如下创建Cookie的时候:Cookie ...
  • aa8568849
  • aa8568849
  • 2017年02月28日 22:11
  • 769

如何用Cookie存储中文信息

问题:存到Cookie时用URLEncoder.encode("中文",   "UTF-8"),但取出来时按"UTF-8"进行转码却不行(ISO-8859-1也不行),什么原因呢?  写Cookie:...
  • yangm1203
  • yangm1203
  • 2007年07月16日 16:34
  • 1208

cookie存入中文报错出现问题

我们在使用中文存入cookie是会出现如下错误 严重: Servlet.service() for servlet [com.bjsxt.servlet.CheckIdentity] in conte...
  • wb453178064
  • wb453178064
  • 2016年04月20日 16:24
  • 1543
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:客户端Cookie中文编程
举报原因:
原因补充:

(最多只允许输入30个字)