关于cookies写入出现乱码的问题
Response.Cookies("psl927@w_5_23_b")("name") = yarst("fstrUserName")
Response.Cookies("name") = yarst("fstrUserName")
写入以后,我用
For each cookie in Request.Cookies
Response.write cookie & "=" & Request.Cookies(cookie)
Response.write "<br>"
next
将COOKIES读出来:
psl927@w_5_23_b=name=%D2%A6%D4%C6%B2%A8
name=姚云波
我将写入改为:
Response.Cookies("psl927@w_5_23_b")("name") = server.HTMLEncode(yarst("fstrUserName"))
读出来结果还是 psl927@w_5_23_b=name=%D2%A6%D4%C6%B2%A8
怎么回出现这样的问题那,怎么才能让Response.Cookies("psl927@w_5_23_b")("name")的值存取正确的汉字
问题点数:100、回复次数:4Top
1 楼net_lover(【孟子E章】)回复于 2006-03-19 18:42:13 得分 20
Response.Cookies("psl927@w_5_23_b")("name") = server.UrlEncode(yarst("fstrUserName"))Top
2 楼anticlimax()回复于 2006-03-24 12:06:01 得分 60
net_lover(孟子E章)的根本不行的,asp.net可以设置不自动编码,asp里不行,我也碰到楼主的问题,最后这样解决
response.Cookies("abc")= server.UrlEncode("111[供]")
<script type="text/javascript">
function Decode_unit(str){
var p,q = "";
// if(str.GetCount("%")!=2)return str;
p=eval("0x" + str.split("%")[1]);
q=eval("0x" + str.split("%")[2]);
if(p<160 || q<160)return unescape(str);
str=str.replace(/%/g,"");
execScript("temp=&H"+str, "vbscript");
execScript("result=chr("+temp+")", "vbscript");
return result;
}
function urldecode(str){
var i,temp;
var result="";
for(i=0;i<str.length;i++){
if(str.charAt(i)=="%"){
if(str.charAt(++i)=="u"){
temp=str.charAt(i++) + str.charAt(i++) + str.charAt(i++) + str.charAt(i++) + str.charAt(i);
result += unescape("%" + temp);
}else{
temp = str.charAt(i++) + str.charAt(i);
if(eval("0x"+temp)<=160){
result += unescape("%" + temp);
}else{
temp += str.charAt(++i) + str.charAt(++i) + str.charAt(++i);
result += Decode_unit("%" + temp);
}
}
}else{
result += str.charAt(i);
}
}
return result;
}
function getCookie(name) {
var arg = name + "=";
var alen = arg.length;
//var cookies=urldecode()
var clen = document.cookie.length;
alert(urldecode(document.cookie.substring(0,clen)));
var i=0;
while(i<clen) {
var j=i+alen;
alert(document.cookie.substring(i,j));
if(document.cookie.substring(i,j)==arg)
return www_helpor_net(j);
i=document.cookie.indexOf(" ",i)+1;if(i==0)
break;
}
return null;
}
function www_helpor_net(offset) {
var endstr=document.cookie.indexOf(";",offset);
if(endstr==-1)
endstr=document.cookie.length;
return unescape(document.cookie.substring(offset,endstr));
}
var keys_str = getCookie('abc');
if(keys_str != null )
{
var keys_array = keys_str.split("#");
for(var i=0;i<keys_array.length;i++){
var type = urldecode(keys_array[i].substring(keys_array[i].length-3,keys_array[i].length));
var key = urldecode(keys_array[i].substring(0,keys_array[i].length-3));
document.writeln(key +type);
}
}
</script>
Top
3 楼sky0120(忍者鱼)回复于 2006-03-24 13:35:41 得分 0
好复杂拉Top
4 楼ieooo(Jet)回复于 2006-03-29 10:23:33 得分 20
///////////////////////////////////////////////////////////////////
以下是从“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交流。Top




