URL 解码与编码
解码百分号编码的 URL,或为查询参数、路径段、跳转地址和 API 调用编码文本。
URL 编码与解码
百分号编码用 % 加两位十六进制数字来表示一个字节。当这些字符作为某个组成部分被编码时,空格变成 %20,& 变成 %26,/ 变成 %2F。
本工具的行为对齐 JavaScript 的 encodeURIComponent 和 decodeURIComponent。它适用于单个查询参数的值,或者单个动态路径段,而不是拿来无脑编码整条 URL —— 把 https://example.com/search?q=test 当成一个组成部分去编码,会把 :、/、?、= 这些撑起 URL 结构的分隔符一并转义掉。
示例
原文:hello world & more
URL 编码后:hello%20world%20%26%20more
- 查询值 —— 单独编码这个值,再放到
key=后面。 - 路径段 —— 把用户可控的文本编码后,再插进
/之间。 - 嵌套的跳转 URL —— 之所以要整条内层 URL 编码,仅仅因为它是外层某个参数的值。
Unicode 文本会先转成 UTF-8 再做百分号转义。如果 % 转义不完整、含有非十六进制字符,或者解出来不是合法 UTF-8,解码就会失败。
表单编码多了一条 + 规则
HTML 表单的查询编码习惯用 + 表示空格。decodeURIComponent 不遵循这条规则,它会原样保留加号。只有当你确定这个值来自 application/x-www-form-urlencoded 时,才把 + 换成空格 —— 无条件地这么做,会把本来就是加号的内容改坏。
编码不会让一条 URL 变得可信
百分号编码这类表示层的操作既不是输入校验,也不是安全边界。跳转目标、主机名、路径、命令参数解码之后,仍然要按应用的实际用途去验证。解码后的值照样可能包含目录穿越序列、来路不明的来源,或者需要在其他上下文中转义的内容。
FAQ
为什么我的 + 没有解码成空格?
因为本工具遵循 decodeURIComponent。加号转空格属于表单编码的规则,只有确认数据是这个格式时才该套用。
我应该编码一整条 URL 吗?
一般不该。请单独编码各个参数值或路径段 —— 整条编码会毁掉 URL 的结构分隔符。只有当整条 URL 是作为数据嵌在另一条 URL 的某个组成部分里时,才需要整条编码。