input.txt
output.txt
把文本编码为 URL 安全格式,或解码 URL 编码的字符串。

URL 编码与解码

百分号编码用 % 加两位十六进制数字来表示一个字节。当这些字符作为某个组成部分被编码时,空格变成 %20& 变成 %26/ 变成 %2F

本工具的行为对齐 JavaScript 的 encodeURIComponentdecodeURIComponent。它适用于单个查询参数的值,或者单个动态路径段,而不是拿来无脑编码整条 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 的某个组成部分里时,才需要整条编码。