本文详细解析JavaScript中encodeURI与encodeURIComponent两个函数的核心区别。重点说明encodeURI保留URI特殊字符如?&=,适用于完整URL编码;而encodeURIComponent会转义所有非保留字符,适用于URI组件(如查询参数)编码。通过代码示例展示两者在特殊字符处理上的差异,并指出在Ajax请求中参数传递时正确使用编码函数的注意事项,避免中文或特殊符号丢失。
encodeURI与encodeURIComponent基础概念
encodeURI和encodeURIComponent函数均用于JavaScript中对URI进行编码,将相关参数转换为UTF-8编码格式的数据。当URI用于定位跳转时,其中的中文、日文等非ASCII字符会自动进行编码转换。
这两个函数在功能上较为相似,但存在一些关键区别。
encodeURI保留不编码的字符共82个,包括:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z。而encodeURIComponent保留不编码的字符共71个,包括:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z。
常见编码问题与解决方案
常见问题:
ajax.get ( url+'?k1'=v1+'&k2'=v2+'&k3'=v3, ... );
若URL仅使用encodeURI编码,当提交参数包含searchWord = a+b时,特殊字符+可能被错误处理为空格a b。
解决方案:
ajax.post( url, params,....)
其中params为对象形式。
原因:当参数为对象或数组时,组件库会自动执行encodeURIComponent编码;若仅传递字符串,组件库不做处理,导致后端接收到特殊字符时被过滤。
encodeURI函数详解
encodeURI()用法
该函数不对ASCII字母、数字及特定标点符号(- _ . ! ~ * ' ( ) )进行编码。
其目的是对完整URI进行编码,因此对URI中具有特殊含义的ASCII标点符号(;/?:@&=+$,#)不进行转义。
提示:若URI组件中包含分隔符(如?和#),应使用encodeURIComponent()分别对各组件进行编码。
示例:
document.write(encodeURI("http://www.w3school.com.cn")+ "<br />")
document.write(encodeURI("http://www.w3school.com.cn/My first/"))
document.write(encodeURI(",/?:@&=+$#"))
//批注:只转换域名后面的部分,并且对,/?:@&=+$#不处理。
// http://www.w3school.com.cn
// http://www.w3school.com.cn/My%20first/
// ,/?:@&=+$#
decodeURI()函数可对encodeURI()编码后的URI进行解码。
encodeURIComponent函数详解
encodeURIComponent()用法
该函数不对ASCII字母、数字及特定标点符号(- _ . ! ~ * ' ( ) )进行编码。
其他字符(如用于分隔URI组件的标点符号:;/?:@&=+$,#)将被替换为一个或多个十六进制转义序列。
提示:请注意encodeURIComponent()与encodeURI()的区别,前者假设参数是URI的一部分(如协议、主机名、路径或查询字符串),因此会转义用于分隔URI各部分的标点符号。
示例:
document.write(encodeURIComponent("http://www.w3school.com.cn"))
document.write(encodeURIComponent("http://www.w3school.com.cn/p 1/"))
document.write(encodeURIComponent(",/?:@&=+$#"))
//对比
// http%3A%2F%2Fwww.w3school.com.cn
// http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F
// %2C%2F%3F%3A%40%26%3D%2B%24%23
decodeURIComponent()函数可对encodeURIComponent()编码后的URI进行解码。