URL 编码(百分号编码)将特殊字符转换为 %XX 形式(其中 XX 是十六进制 ASCII 码)。URL 解码则是将 %XX 恢复为原始字符。Bash 脚本中可以通过多种方式实现 URL 解码。
1. 使用 printf 和 sed 的基本解码
最简洁的方法:利用 printf 的 \\x 格式将十六进制转为字符。
url_decode() {
local encoded=\”$1\”
# 将 %XX 转换为 \\xXX,然后交给 printf 解析
printf \’%b\’ \”${encoded//%/\\\\x}\”
}
示例:
decoded=$(url_decode \”Hello%20World%21\”)
echo \”$decoded\” # 输出: Hello World!
注意:%b 会展开反斜杠转义序列,\\xXX 正是 printf 支持的十六进制转义。
2. 更完整的解码函数(处理 + 号)
在 application/x-www-form-urlencoded 数据中,空格通常编码为 + 号,而非 %20。需要先将 + 替换为空格。
url_decode() {
local encoded=\”$1\”
# 将 + 替换为空格
encoded=\”${encoded//+/ }\”
# 将 %XX 转为对应的字符
printf \’%b\’ \”${encoded//%/\\\\x}\”
}
测试:
decoded=$(url_decode \”name=John+Doe&city=NYC\”)
echo \”$decoded\” # 输出: name=John Doe&city=NYC
3. 使用 sed 逐字符转换(更可靠但较慢)
对于特殊字符(如 %0A 换行符)的处理,printf \’%b\’ 有时受 locale 影响。可以使用 sed 配合 xxd 或 perl:
url_decode() {
echo




