在文本应用程序中, 从客户端到服务器端数据传输编码标准是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