在线URL编码解码
在线URL编码解码编码解码工具
关于URL编码解码
这里用的是 encodeURIComponent 和 decodeURIComponent,和浏览器真正发请求时的处理一致,所以你看到的结果就是线上实际传的东西。
具体表现:空格变成 %20(不是 +),中文变成百分号编码的 UTF-8,&、=、?、/ 这些也会被转义——它们在 URL 里有语法含义,不转义会改变整条链接指向哪里。
+ 和 %20 的差别
表单提交(application/x-www-form-urlencoded)会把空格变成 +,encodeURIComponent 不会。所以从查询串里复制出来的值,用严格解码器处理时 + 还是加号——hello+world 解出来就是一个带加号的词。
判断方法:路径里、单个参数值里用 %20;整条查询串里出现 +,它代表空格。
encodeURI 和 encodeURIComponent 别混用
区别在 :/?#[]@ 这几个字符:encodeURI 不转义它们,所以能套在整条 URL 上;encodeURIComponent 全部转义,只能用在单个参数值上。
手工拼链接最常见的 bug 就是混用:参数里带个 &,没转义,链接直接裂成两个参数,服务端收到的值和你想的完全不是一回事。这里做的是后者,也就是编码参数值。
常见问题
为什么空格变成 %20 而不是 +?
因为这里编码的是参数值,不是表单提交。两种写法在各自场景都成立:+ 只在表单编码里代表空格,%20 在哪都能用。
中文变成一大串 %E4 是正常的吗?
正常。一个汉字是 3 个 UTF-8 字节,每个字节编成一个 %XX,所以一个字会变成 9 个字符。
该用 encodeURI 还是 encodeURIComponent?
编码单个值用 encodeURIComponent;整条已经是完整 URL、只想转义非法字符时才用 encodeURI。
为什么解码会报错?
多半是孤立的 % 后面没跟两位十六进制,或者多字节序列被截断了。这种字符串本来就不是合法的百分号编码。