在文本應用程序中, 從客戶端到服務器端數據傳輸編碼標准是application/x-www-form-urlencoded 這種數據的基本形式是采用"&"分割開的key/value例如: name1=value1&name2=value2&name3=value3&.....&nameN=valueN
其中每一個key和value均按照如下規則進行編碼:
- 用"+"取代空字符
- 非數字, 字母用%HH格式進行替換, 其中HH是兩位16進制數字, 表示被替換字符的ASCII碼(例如"?"會被替換成"%3F", 對應十進制數是63, 也就是問號對應的ASCII值)
- 換行符用CR LF字符對表示, 對應的值是"%0D%0A";
form提交的數據默認使用的就是application/x-www-form-urlencoded, 所以無需關系編碼, 當使用ajax組織數據時, 需要用戶執行必要的轉換
- encodeURIComponent()方法. 在一些舊版本的javascript中這個方法是不可用的並且需要依賴於escape()方法,
- escape()方法不會對一些瀏覽器需要的字符進行編碼這里面包括"@", "/"和"+", 已經不推薦使用, 可以作為后備
- encodeURIComponent()對一些字符不進行轉義: "~" "!" "." "'" "(" ")"
- escape()和encodeURIComponent()都將空白字符編碼為%20而不是"+"
- 綜合以上得出一個比較合理的轉換函數, 不依賴瀏覽器產生符合規范的編碼
1 function encodeValue(val) 2 { 3 var encodedVal; 4 if (!encodeURIComponent) 5 { 6 encodedVal = escape(val); 7 /* fix the omissions */ 8 encodedVal = encodedVal.replace(/@/g, '%40'); 9 encodedVal = encodedVal.replace(/\//g, '%2F'); 10 encodedVal = encodedVal.replace(/\+/g, '%2B'); 11 } 12 else 13 { 14 encodedVal = encodeURIComponent(val); 15 /* fix the omissions */ 16 encodedVal = encodedVal.replace(/~/g, '%7E'); 17 encodedVal = encodedVal.replace(/!/g, '%21'); 18 encodedVal = encodedVal.replace(/\(/g, '%28'); 19 encodedVal = encodedVal.replace(/\)/g, '%29'); 20 encodedVal = encodedVal.replace(/'/g, '%27'); 21 } 22 /* clean up the spaces and return */ 23 return encodedVal.replace(/\%20/g,'+'); 24 }
參考: http://ajaxref.com/ch2/imagegenerator.html
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FencodeURI