URL 编码器

编码和解码 URL 字符串。

免费在线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 表单或发布表单编码数据时,+ 是可接受的。大多数服务器和框架两者都能处理,但使用正确编码可避免边界情况和歧义。

常见问题

为什么 URL 需要编码?
URL 只能包含有限的 ASCII 字符集。空格、&、=、? 以及非 ASCII 字符(带重音字母、中日韩字符)具有特殊含义或不被允许。编码将这些字符转换为安全的百分号编码格式,使 URL 保持有效且数据正确传输。
encodeURI 与 encodeURIComponent 有何区别?
encodeURI() 编码完整 URL,保留有效的 URL 分隔符(: / ? # & =)。encodeURIComponent() 编码 URL 组件(如查询参数值),编码包括分隔符在内的所有特殊字符。查询字符串中的用户输入请使用 encodeURIComponent()。仅在编码已有正确结构的完整 URL 时使用 encodeURI()。
URL 中的 %20 是什么意思?
%20 是空格字符的百分号编码表示。20 是空格的十六进制 ASCII 码(十进制 32)。任何字符都可以这样表示:% 后跟其两位十六进制码。例如,%2F 是 /,%26 是 &,%3D 是 =。
应该编码整个 URL 还是只编码查询参数?
仅编码包含动态或用户提供数据的部分——通常是查询参数值,有时也包括路径段。不要编码 URL 结构本身(协议、主机、路径分隔符)。例如:https://example.com/search?q= + encodeURIComponent(userQuery)。用 encodeURIComponent 编码整个 URL 会破坏协议和主机。
如何处理 URL 中的 Unicode 字符?
Unicode 字符先编码为 UTF-8 字节,再对每个字节进行百分号编码。字符「日」(U+65E5)变成三个 UTF-8 字节(0xE6、0x97、0xA5),编码为 %E6%97%A5。现代浏览器在地址栏显示 Unicode 字符,但向服务器发送百分号编码形式。标准库中的所有编码函数都会自动处理这一点。
+ 与 %20 表示空格有何区别?
用 + 表示空格仅在 application/x-www-form-urlencoded 数据(HTML 表单提交)中有效。%20 是空格的标准百分号编码,在 URL 任何位置都正确。构建 API URL 时使用 %20;提交表单数据时 + 可接受。大多数服务器两者都能处理,但使用正确编码可避免歧义。
URL 编码与 HTML 编码相同吗?
不相同。URL 编码(百分号编码)将字符转换为 %XX 格式以便在 URL 中安全使用。HTML 编码将字符转换为实体引用(&、<、')以便在 HTML 中安全显示。它们解决不同问题:URL 编码确保 URL 有效性,HTML 编码防止 XSS 攻击和显示问题。在需要另一种编码的地方使用其中一种会导致错误。