本文目录导读:

URLDecoder 主要用于对经过 application/x-www-form-urlencoded MIME 格式编码的 URL 参数进行解码,它将 %XX(百分号编码)和 号还原为原始的字符。
以下是关于 URLDecoder 解码的详细说明,包括使用场景、不同编程语言的方法以及需要注意的坑。
核心功能
- 将
%XX转换为字符:%20-> 空格,%E4%B8%AD%E6%96%87-> “中文”。 - 将 号转换为空格:这是
application/x-www-form-urlencoded格式的标准(在查询字符串中,空格通常编码为 ,而不是%20)。
各主要编程语言的实现
Java
Java 的 java.net.URLDecoder 非常经典。
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
public class DecodeExample {
public static void main(String[] args) {
// 假设这是从 URL 中获取到的编码字符串
String encoded = "name=%E5%BC%A0%E4%B8%89&age=25&city=New+York";
try {
// 解码,必须指定字符集(通常为 UTF-8)
String decoded = URLDecoder.decode(encoded, StandardCharsets.UTF_8.name());
System.out.println(decoded);
// 输出: name=张三&age=25&city=New York
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java 注意事项:
- 必须指定字符集:
URLDecoder.decode(String s, String charset),使用UTF-8基本不会出错。 - 不解析整个 URL:
URLDecoder是为单个查询参数(或查询字符串)设计的。不要用它来解码整个 URL(包括http://和路径部分),因为 、 等字符是 URL 的语法符,不应被解码,解码整个 URL 应使用java.net.URI类。
JavaScript (Web 前端 / Node.js)
浏览器环境下的 decodeURIComponent() 是标准方法。
// 编码后的字符串 const encoded = "name%20=%20%E5%BC%A0%E4%B8%89%26age%3D25"; // 解码 (decodeURIComponent 会自动使用 UTF-8) const decoded = decodeURIComponent(encoded); console.log(decoded); // 输出: name = 张三&age=25
JavaScript 注意事项:
decodeURI()vsdecodeURIComponent():decodeURIComponent():解码完整的、经过编码的查询参数值,它能处理%20、%E4%B8%AD等,遇到 号会原样输出(不会转为空格)。- 解决方案:如果参数来自 HTML 表单,需要先手动将 替换为空格:
str.replace(/\+/g, ' '),然后再执行decodeURIComponent。
- 解决方案:如果参数来自 HTML 表单,需要先手动将 替换为空格:
decodeURI():用于解码整个 URI(如https://example.com/path?name=%20),但不会解码 、、&、 等 URI 特殊字符,它同样不会把 转为空格。
Python
Python 3 使用 urllib.parse 模块。
from urllib.parse import unquote_plus # 编码后的字符串 encoded = "name=%E5%BC%A0%E4%B8%89&age=25&city=New+York" # 使用 unquote_plus (会把 + 转为空格) decoded = unquote_plus(encoded) print(decoded) # 输出: name=张三&age=25&city=New York # 如果不想把 + 转为空格,可以使用 unquote # decoded = unquote(encoded)
Python 注意事项:
unquote_plus():标准解码方法,把 转换为空格,适用于application/x-www-form-urlencoded格式。unquote():只转换%XX,保留 不变。unquote_to_bytes():返回字节对象而不是字符串。
C# (.NET)
使用 System.Web.HttpUtility.UrlDecode 或 System.Net.WebUtility.UrlDecode。
using System;
using System.Web; // 需要引用 System.Web 程序集
// 或者使用 System.Net.WebUtility (在 .NET Core / .NET 5+ 中推荐)
public class Program
{
public static void Main()
{
string encoded = "name=%E5%BC%A0%E4%B8%89&age=25&city=New+York";
// 方法1: HttpUtility.UrlDecode
string decoded1 = HttpUtility.UrlDecode(encoded);
Console.WriteLine(decoded1);
// 输出: name=张三&age=25&city=New York
// 方法2: WebUtility.UrlDecode (.NET Core / .NET 5+)
string decoded2 = System.Net.WebUtility.UrlDecode(encoded);
Console.WriteLine(decoded2);
}
}
C# 注意事项:
HttpUtility.UrlDecode默认使用 UTF-8 编码。WebUtility.UrlDecode是较新的选择,不依赖于System.Web.dll,在控制台应用和类库中更方便。
PHP
PHP 内置 urldecode() 函数。
<?php $encoded = "name=%E5%BC%A0%E4%B8%89&age=25&city=New+York"; $decoded = urldecode($encoded); echo $decoded; // 输出: name=张三&age=25&city=New York ?>
PHP 注意事项:
urldecode()会自动把 转为空格,并把%XX解码。- 如果字符串中已经包含了 + 号,但并不是代表空格(Base64 编码中的 ),则
urldecode会误转换,这种情况下,可以考虑先用str_replace('+', '%2B', $str)把 先保护起来,或者用rawurldecode()(但 rawurldecode 不会把 + 转为空格)。
常见问题与解码技巧
区分 和 %20
- :在
application/x-www-form-urlencodedMIME 类型(即 HTML 表单查询字符串)中,代表空格。 %20:在 URL 路径或标准 RFC 3986 百分号编码中,代表空格。
解码建议:
- 如果是解析 URL 的
query string( 后面的部分),应把 转为空格。 - 如果是解析 URL 的
path部分( 之间的部分), 应保留原样(不转为空格),只解码%20。
解码整个 URL
- 不要直接对
https://...整个字符串用URLDecoder或decodeURIComponent。 - 应该先解析 URL,获取路径和查询参数,然后只解码参数的值和路径中编码过的部分。
- Java:使用
java.net.URI。 - JavaScript:使用
new URL(url),然后读取searchParams。
避免双重解码
如果对一个已经解码的字符串再次解码,%25(代表 字符的编码)会被变成 ,可能导致错误,确保只解码一次。
Base64 编码冲突
Base64 字符串中包含 、、 字符,如果试图用 URLDecoder 解码一个 Base64 字符串, 会变成空格,导致数据损坏。
- 解决:先用
replace('+', '%2B')对 进行转义,然后解码;或者直接使用 URL安全的 Base64(将 替换为 , 替换为 )编码。