遇到过...
我是这样解决的:
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);
}

解决方案 »

  1.   

    ///////////////////////////////////////////////////////////////////以下是从“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   strRtnfor   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,strRtnstrArr=Split(str,"a");for   i=UBound(strArr)-LBound(strArr)   to   1   step   -1
    strRtn=strRtn   &   chrw(Val(strArr(i)))
    nextDecodeCookie=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交流。
      

  2.   

    cookie 中值的部分在发送的时候会被自动用 urlencode 编码并在接收到的时候被自动解码并把值赋给与自己同名的 cookie 变量。如果不想这样并且在使用 PHP 5 的话,可以用 setrawcookie() 来代替。