天天看點

cookie存取中文

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字串提取出來,再用對應的函數轉換為原字元。

<script LANGUAGE=javascript>

</script>

VBScript版程式如下:

<script LANGUAGE=vbscript>

例如你要寫入的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

  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交流。

上一篇: 資料庫優化1
下一篇: Android存取txt

繼續閱讀