|
我們知道,寫(xiě)入Cookie內(nèi)容前需要進(jìn)行escape(十六進(jìn)制編碼),編碼時(shí)又是以字節(jié)為單位的,這就是問(wèn)題的關(guān)鍵所在:任何一個(gè)漢字都會(huì)被拆成兩個(gè)字節(jié)分別編碼;而在讀Cookie時(shí),unescape又以字節(jié)單位解碼,因此最后每個(gè)漢字都變成了兩個(gè)字節(jié)的亂碼。怎么辦呢?ASP或php方式能夠正確讀出,應(yīng)該是在unescape解碼后,又按照unicode編碼把其中的漢字拼了出來(lái)。如果這樣的話,能不能找到一種變通的方法解決這個(gè)問(wèn)題呢?仔細(xì)研究后發(fā)現(xiàn),只要在十六進(jìn)制codec(編解碼)過(guò)程中能夠保存漢字信息就行了,因而我們需要再外包一層codec過(guò)程,方案如下:
1.在escape編碼前,把Cookie字符串中的每個(gè)字符轉(zhuǎn)換為unicode碼的字符串形式(用一特殊字符作為字串的分隔符)。
2.在unescape解碼后,先把所有unicode字串提取出來(lái),再用對(duì)應(yīng)的函數(shù)轉(zhuǎn)換為原字符。
復(fù)制代碼 代碼如下:
<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版程序如下:
復(fù)制代碼 代碼如下:
<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>
例如你要寫(xiě)入的Cookie內(nèi)容是"一頂abc",經(jīng)過(guò)CodeCookie變?yōu)?99a98a97a-31029a26432a"(基于安全考慮,將字符串反轉(zhuǎn)),再經(jīng)過(guò)escape編碼后變?yōu)?99a98a97a%2D31029a26432a"(escape編碼將除字母和數(shù)字以外的字符轉(zhuǎn)換為十六進(jìn)制%XX的形式),注意分隔符不能選%,D和數(shù)字。當(dāng)然,如果有類(lèi)似密碼的重要信息,還需要在加密上再?gòu)?qiáng)化一下。因?yàn)閷?xiě)入Cookie的一般都是短信息,編碼后增加的一些字節(jié)可忽略不計(jì)。下面的Javascript讀寫(xiě)Cookie函數(shù)中就加入了以上的中文支持。
function SetCookie(name,value,expires)
{
var exp=new Date();
exp.setTime(exp.getTime()+expires*60*1000);
documents.cookie=name+"="+escape(CodeCookie(value))+" ; expires="+exp.toGMTString()+" ; path=/";
}
function GetCookie (name)
{
var strArg=name+"=";
var nArgLen=strArg.length;
var nCookieLen=documents.cookie.length;
var nEnd;
var i=0;
var j;
while (i<nCookieLen)
{
j=i+nArgLen;
if (documents.cookie.substring(i,j)==strArg)
{
nEnd=documents.cookie.indexOf (";",j);
if (nEnd==-1) nEnd=documents.cookie.length;
return DecodeCookie(unescape(documents.cookie.substring(j,nEnd)));
}
i=documents.cookie.indexOf(" ",i)+1;
if (i==0) break;
}
return null;
}
如果用CGI程序?qū)懭胫形腃ookie,客戶端讀取。如在ASP里,可以先使用前述的編碼函數(shù)后,再用response寫(xiě)入,例如:response.cookies("Name")=CodeCookie("張三")至此,中文Cookie的問(wèn)題基本解決。
JavaScript技術(shù):用Javascript讀取中文COOKIE的解決辦法,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。