總結:服務端客戶端變量建議都是用 utf-8字符集, 前后傳遞的變量都建議使用url編碼處理。php setcookie 保存到客戶端的變量會自動url編碼的, 所以客戶端獲取后需要decodeURIComponent解碼
客戶端自己存變量前建議用encodeURIComponent先編碼在存在,利於統一和減少因為編碼或者字符集引起的問題。
PHP 服務端: 需要特別注意path路徑設置以/,同時路徑加變量名唯一確定cookie的作用域 urlencode urldecode
urlencode和rawurlencode的區別:
urlencode 將空格則編碼為加號(+)
rawurlencode 將空格則編碼為加號(%20)
urldecode %20,+都解碼為空格 rawurldecode %20解碼空格 +號不變,雖然這樣但是要注意的是
測試代碼:
echo urlencode('我+a的 等我');
echo urldecode('%E6%88%91%2Ba%E7%9A%84+%E7%AD%89%E6%88%91');
echo urldecode('%E6%88%91%2Ba%E7%9A%84%20%E7%AD%89%E6%88%91');
echo rawurlencode('我+a的 等我');
echo rawurldecode('%E6%88%91%2Ba%E7%9A%84+%E7%AD%89%E6%88%91');
echo rawurldecode('%E6%88%91%2Ba%E7%9A%84%20%E7%AD%89%E6%88%91');
1.設置setcookie('classGUID',$classGUID,time()+3600*24,'/');
2.獲取$_COOKIE['key']
3.刪除setcookie('classGUID',$classGUID,time()-3600*24,'/');
客戶端js: escape 被w3c棄用了,encodeURI使用UTF-8對非ASCII字符進行編碼對整個路徑url編碼,encodeURIComponent使用UTF-8對非ASCII字符進行編碼對單個變量編碼
1.//設置cookie
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires="+d.toUTCString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
2.//獲取cookie
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1);
if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
}
return "";
}
3.//清除cookie
function clearCookie(name) {
setCookie(name, "", -1);
}
escape,encodeURI,encodeURIComponent——都是用於將不安全不合法的Url字符轉換為合法的Url字符表示,它們有以下幾個不同點。
安全字符不同:
下面列出了這三個函數的安全字符(即函數不會對這些字符進行編碼)
- escape(69個):*/@+-._0-9a-zA-Z
- encodeURI(82個):!#$&'()*+,/:;=?@-._~0-9a-zA-Z
- encodeURIComponent(71個):!'()*-._~0-9a-zA-Z
兼容性不同:escape函數是從Javascript 1.0的時候就存在了,其他兩個函數是在Javascript 1.5才引入的。但是由於Javascript 1.5已經非常普及了,所以實際上使用encodeURI和encodeURIComponent並不會有什么兼容性問題。
對Unicode字符的編碼方式不同:這三個函數對於ASCII字符的編碼方式相同,均是使用百分號+兩位十六進制字符來表示。但是對於Unicode字符,escape的編碼方式是%uxxxx,其中的xxxx是用來表示unicode字符的4位十六進制字符。這種方式已經被W3C廢棄了。但是在ECMA-262標准中仍然保留着escape的這種編碼語法。encodeURI和encodeURIComponent則使用UTF-8對非ASCII字符進行編碼,然后再進行百分號編碼。這是RFC推薦的。因此建議盡可能的使用這兩個函數替代escape進行編碼。
適用場合不同:encodeURI被用作對一個完整的URI進行編碼,而encodeURIComponent被用作對URI的一個組件進行編碼。從上面提到的安全字符范圍表格來看,我們會發現,encodeURIComponent編碼的字符范圍要比encodeURI的大。我們上面提到過,保留字符一般是用來分隔URI組件(一個URI可以被切割成多個組件)或者子組件(如URI中查詢參數的分隔符),如:號用於分隔scheme和主機,?號用於分隔主機和路徑。由於encodeURI操縱的對象是一個完整的的URI,這些字符在URI中本來就有特殊用途,因此這些保留字符不會被encodeURI編碼,否則意義就變了。
組件內部有自己的數據表示格式,但是這些數據內部不能包含有分隔組件的保留字符,否則就會導致整個URI中組件的分隔混亂。因此對於單個組件使用encodeURIComponent,需要編碼的字符就更多了。
服務端設置cookie后 空格被編碼為+,然而jsencodeURI,encodeURIComponent不能將加好解碼成空格,處理方式可以 str.replace(/\+/g,"%20")將讀取到的字符的+號先替換成%20,然后在encodeURIComponent。
測試驗證代碼如下:
echo urlencode('我的+ 等我');
setcookie('classGUID','ab s +',time()+3600*24,'/');
echo '<script >
window.onload=(function() {
var classGUID = getCookie("classGUID");
console.log(classGUID);
classGUID = classGUID.replace(/\+/g,"%20");
console.log(classGUID);
classGUID = decodeURIComponent(classGUID);
console.log(classGUID);
});
//設置cookie
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires="+d.toUTCString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
//獲取cookie
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(";");
for(var i=0; i<ca.length; i++) {
var c = ca[i];
while (c.charAt(0)==" ") c = c.substring(1);
if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
}
return "";
}
</script>';
die;
當Html的表單被提交時,每個表單域都會被Url編碼之后才在被發送。由於歷史的原因,表單使用的Url編碼實現並不符合最新的標准。例如對於空格使用的編碼並不是%20,而是+號,如果表單使用的是Post方法提交的,我們可以在HTTP頭中看到有一個Content-Type的header,值為application/x-www-form-urlencoded。大部分應用程序均能處理這種非標准實現的Url編碼,但是在客戶端Javascript中,並沒有一個函數能夠將+號解碼成空格,只能自己寫轉換函數。還有,對於非ASCII字符,使用的編碼字符集取決於當前文檔使用的字符集
參考:
http://blog.csdn.net/sunlovefly2012/article/details/46726561