在PHP里存入COOKIE中的中文内容,JS里取出来是乱码,该如何处理?

lingye 2006-03-10 10:36:17
都是UTF-8编码的
...全文
1035 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gdj 2006-03-29
  • 打赏
  • 举报
回复
cookie 中值的部分在发送的时候会被自动用 urlencode 编码并在接收到的时候被自动解码并把值赋给与自己同名的 cookie 变量。如果不想这样并且在使用 PHP 5 的话,可以用 setrawcookie() 来代替。
ieooo 2006-03-29
  • 打赏
  • 举报
回复
///////////////////////////////////////////////////////////////////

以下是从“http://www.yesky.com”摘录过来的一篇文章,具体出处:http://www.yesky.com/20001128/139005.shtml,作者是谁不知道
里面很详细地叙述了处理“中文乱码”的方法。

//////////////////////////////////////////////////////////////////

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字串提取出来,再用对应的函数转换为原字符。

$#@60;SCRIPT LANGUAGE=javascript$#@62;
$#@60;!--
//编码程序:
function CodeCookie(str)
{
 var strRtn="";

 for (var i=str.length-1;i$#@62;=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$#@62;=0;i--)
 strRtn+=String.fromCharCode(eval(strArr[i]));

 return strRtn;
}
//--$#@62;
$#@60;/script$#@62;


VBScript版程序如下:

$#@60;SCRIPT LANGUAGE=vbscript$#@62;
$#@60;!--
"编码程序:
function CodeCookie(str)
Dim i
Dim strRtn

for i=len(str) to 1 step -1
strRtn=strRtn & ascw(mid(str,i,1))
if (i$#@60;$#@62;1) then strRtn trRtn & "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
--$#@62;
$#@60;/script$#@62;


例如你要写入的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$#@60;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交流。
faisun 2006-03-11
  • 打赏
  • 举报
回复
遇到过...
我是这样解决的:
PHP 用 escape 加密,到客户端再用 unescape 解密.
xuzuning(唠叨) 的 BLOG 有 PHP 的 escape 函数:
function escape($str) {
preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(ord($v[0]) < 128)
$ar[$k] = rawurlencode($v);
else
$ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
}
return join("",$ar);
}

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧