免费在线URL编码器和解码器
URLs 不能包含空格、& 符号或原始 unicode 字符 - 它们需要百分比编码。 Dokall 对字符串进行编码以便在 URLs 中安全使用,并将编码值解码回纯文本。
对于构建查询字符串、调试重定向 URLs 以及处理 Web 应用程序中的国际字符至关重要。
什么是 URL 编码?
URL 编码(也称百分号编码)将 URL 中不允许或具有特殊含义的字符转换为安全格式。每个不安全字符会被替换为百分号后跟两个十六进制数字,表示该字符的 ASCII 或 UTF-8 字节值。
例如,空格变成 %20,& 变成 %26,斜杠 / 变成 %2F。日文字符「日」变成 %E6%97%A5(UTF-8 三个字节,各自百分号编码)。这确保无论携带何种数据,URL 都保持有效且无歧义。
保留字符与非保留字符
URL 有两类字符。非保留字符可在 URL 任意位置出现而无需编码:A–Z、a–z、0–9、连字符 (-)、句点 (.)、下划线 (_) 和波浪号 (~)。这些始终是安全的。
保留字符在 URL 语法中有特殊含义:: / ? # [ ] @ ! $ & ' ( ) * + , ; =。例如,? 开始查询字符串,& 分隔查询参数,# 开始片段。当这些字符作为数据(而非分隔符)使用时,必须进行百分号编码。
棘手之处在于:字符是否需要编码取决于出现位置。路径中的 / 分隔目录(不要编码);查询参数值中的 / 是数据(需要编码)。这种依赖上下文的编码正是存在不同编码函数的原因。
JavaScript 中的 encodeURI 与 encodeURIComponent
JavaScript 提供两个用途不同的编码函数。
encodeURI() 编码完整 URI。它保留 URI 中有效的字符:: / ? # [ ] @ ! $ & ' ( ) * + , ; =。当你有完整 URL,只想编码在任何 URL 位置都无效的字符(空格、非 ASCII 字符等)时使用它。
encodeURIComponent() 编码 URI 组件——URL 的一部分,如查询参数值。它会编码包括 & = ? / 在内的所有保留字符,因为这些可能与 URL 结构冲突。构建查询字符串时使用:"?search=" + encodeURIComponent(userInput)。
常见错误:对查询字符串中的用户输入使用 encodeURI()。若用户输入包含 &,它不会被编码,浏览器会将其解释为参数分隔符。查询参数值务必使用 encodeURIComponent()。
不同语言中的 URL 编码
在 Python 中:urllib.parse.quote() 编码字符串组件(类似 encodeURIComponent)。urllib.parse.quote_plus() 将空格编码为 + 而非 %20(用于 application/x-www-form-urlencoded 数据)。urllib.parse.urlencode() 将字典编码为查询字符串。
在 Java 中:URLEncoder.encode(str, "UTF-8") 用于表单数据编码(空格变成 +)。路径编码请使用 URI 类构造函数或 Apache Commons HttpClient 等库。
在 Go 中:url.QueryEscape() 用于查询字符串编码(空格变成 +)。url.PathEscape() 用于路径段编码(空格变成 %20)。net/url 包提供会自动处理编码的 URL 解析与构建。
在 PHP 中:urlencode() 将空格编码为 +(表单编码)。rawurlencode() 将空格编码为 %20(RFC 3986)。路径组件使用 rawurlencode(),表单数据使用 urlencode()。
URL 中的空格:%20 与 + 及各自适用场景
URL 中有两种方式编码空格,正确选择取决于上下文。
%20 是 RFC 3986 定义的标准空格百分号编码。它在所有 URL 组件中都正确——路径段、查询参数名、查询参数值和片段。
+ 是空格的另一种编码,但仅适用于 application/x-www-form-urlencoded 内容类型——HTML 表单提交使用的格式。在此上下文(且仅在此上下文)中,空格编码为 +,而 + 编码为 %2B。
构建 API 调用 URL 时使用 %20。提交 HTML 表单或发布表单编码数据时,+ 是可接受的。大多数服务器和框架两者都能处理,但使用正确编码可避免边界情况和歧义。