动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   Jsp → 阅读文章

 客户端Cookie中文编程

作者来源: 
阅读 2700 人次 , 2006-3-29 4:24:00 


在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);
  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交流。

 本文Tagscookies  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:使用Ant和Tomcat创建Web应用
· 下一篇:JSP飞速发展前景光明
· JSP连接各类数据库大全(7)
· JDBC 入门(二)
· JAVA/JSP学习系列之七
· JAVA/JSP学习系列之九
· Servlets和JSP开发原则


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077