明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

客戶端Cookie中文編程(1)

[摘要]在Cookie的使用中,我們發(fā)現(xiàn)這樣一個(gè)問題:如果寫入Cookie的內(nèi)容是中文(如用戶稱呼),用服務(wù)器端程序(如ASP 或PHP)讀出完全正確,但是用一般的JavaScript或VBScript的讀Cookie函數(shù)取出的卻是一堆亂碼。這是一個(gè)棘手的問題, 因?yàn)樵谟行┣闆r下,Cookie的內(nèi)容需要在...

在Cookie的使用中,我們發(fā)現(xiàn)這樣一個(gè)問題:如果寫入Cookie的內(nèi)容是中文(如用戶稱呼),用服務(wù)器端程序(如ASP
或PHP)讀出完全正確,但是用一般的JavaScript或VBScript的讀Cookie函數(shù)取出的卻是一堆亂碼。這是一個(gè)棘手的問題,
因?yàn)樵谟行┣闆r下,Cookie的內(nèi)容需要在客戶機(jī)端用腳本語言讀取。如果你寫入了中文,得到了一堆亂碼,是不是感覺很
別扭呢?解決這個(gè)問題,還要從Cookie的存取方式說起。
我們知道,寫入Cookie內(nèi)容前需要進(jìn)行escape(十六進(jìn)制編碼),編碼時(shí)又是以字節(jié)為單位的,這就是問題的關(guān)鍵所
在:任何一個(gè)漢字都會被拆成兩個(gè)字節(jié)分別編碼;而在讀Cookie時(shí),unescape又以字節(jié)單位解碼,因此最后每個(gè)漢字都變
成了兩個(gè)字節(jié)的亂碼。怎么辦呢?ASP或PHP方式能夠正確讀出,應(yīng)該是在unescape解碼后,又按照unicode編碼把其中的漢
字拼了出來。如果這樣的話,能不能找到一種變通的方法解決這個(gè)問題呢?仔細(xì)研究后發(fā)現(xiàn),只要在十六進(jìn)制codec(編解
碼)過程中能夠保存漢字信息就行了,因而我們需要再外包一層codec過程,方案如下:

1.在escape編碼前,把Cookie字符串中的每個(gè)字符轉(zhuǎn)換為unicode碼的字符串形式(用一特殊字符作為字串的分隔
符)。

2.在unescape解碼后,先把所有unicode字串提取出來,再用對應(yīng)的函數(shù)轉(zhuǎn)換為原字符。

<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>





相關(guān)文章