url-encode url-decode percent-encoding developer-tools rfc3986

URL 编码在线免费:百分比编码终极指南

免费在线进行 URL 编码和解码。了解 RFC 3986 百分比编码、保留字符以及 URL 结构中的常见问题。

URL 编码在线免费:百分比编码终极指南

URL 编码,也称为 百分比编码 (Percent-encoding),是一种在统一资源标识符 (URI) 中对信息进行编码的机制。虽然它看起来像是一个简单的技术细节,但它是 Web 运行的基础,确保数据在浏览器和服务器之间正确传输。

在本指南中,我们将深入探讨为什么需要 URL 编码、它的工作原理,并提供一个方便的在线工具供您使用。

为什么需要 URL 编码?

URL(统一资源定位符)具有由 RFC 3986 定义的有限字符集。它们只能包含某些字符。如果您需要包含不属于此集合的字符——例如空格、非 ASCII 字符(如中文或阿拉伯语)或在 URL 中具有特殊含义的字符(如 &=)——则必须对它们进行编码。

保留字符与非保留字符

根据规范,字符分为两类:

  1. 非保留字符 (Unreserved Characters): 可以在 URL 中直接使用而无需编码。它们包括:

    • 大写和小写字母 (A-Z, a-z)
    • 数字 (0-9)
    • 连字符 (-)、下划线 (_)、句点 (.) 和波浪号 (~)
  2. 保留字符 (Reserved Characters): 在 URL 中具有特殊含义(例如,它们用作分隔符,如 /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, =)。如果这些字符是发送数据的一部分(如搜索查询)而不是充当分隔符,则必须对其进行编码。

百分比编码的工作原理

百分比编码将保留字符替换为 %,后跟其 ASCII 值的两位十六进制表示。

例如:

  • 空格 变为 %20(ASCII 值 32,十六进制 20)。
  • 感叹号 (!) 变为 %21(ASCII 值 33,十六进制 21)。
  • 和号 (&) 变为 %26(ASCII 值 38,十六进制 26)。

常见编码字符表

字符 编码值 说明
空格 %20+ 取决于 URL 的部分
! %21 感叹号
# %23 井号(片段标识符)
$ %24 美元符号
& %26 和号(查询分隔符)
' %27 单引号
( %28 左括号
) %29 右括号
* %2A 星号
+ %2B 加号
, %2C 逗号
/ %2F 正斜杠(路径分隔符)
: %3A 冒号
; %3B 分号
= %3D 等号(查询参数)
? %3F 问号(查询开始)
@ %40 At 符号

空格处理:%20 vs. +

您可能已经注意到,有时空格被编码为 %20,而有时被编码为 +

  • %20 是 URI 任何部分中空格的标准编码。
  • + 专门用于 URL 的查询字符串部分(? 之后)。这源于 HTML 表单使用的旧版 application/x-www-form-urlencoded 媒体类型。

现代工具和库通常会自动处理这个问题,但这仍然是开发人员经常感到困惑的地方。

编程中的 URL 编码

大多数编程语言都提供了内置的 URL 编码和解码函数。

JavaScript

// 编码 URI 组件
const query = "hello world & friends";
const encoded = encodeURIComponent(query);
console.log(encoded); // 输出: hello%20world%20%26%20friends

// 解码
const decoded = decodeURIComponent(encoded);
console.log(decoded); // 输出: hello world & friends

Python

import urllib.parse

query = "hello world & friends"
encoded = urllib.parse.quote(query)
print(encoded) # 输出: hello%20world%20%26%20friends

decoded = urllib.parse.unquote(encoded)
print(decoded) # 输出: hello world & friends

PHP

<?php
$query = "hello world & friends";
$encoded = urlencode($query);
echo $encoded; // 输出: hello+world+%26+friends

$decoded = urldecode($encoded);
echo $decoded; // 输出: hello world & friends
?>

常见问题解答 (FAQ)

1. 我应该编码整个 URL 还是只编码其中的一部分?

通常您应该只编码查询参数的或路径的特定段。编码整个 URL(包括 http://, :/ 分隔符)将使其作为 URI 失效。对值使用 encodeURIComponent(),对整个 URI 使用 encodeURI()(它会跳过分隔符)。

2. URL 编码和 Base64 编码一样吗?

不一样。URL 编码(百分比编码)用于在 URL 中转义字符。Base64 用于将二进制数据表示为 64 个 ASCII 字符的字符串。它们的用途完全不同。

3. 为什么我收到“Malformed URI”错误?

这通常发生在解码过程中,当字符串包含 % 字符但其后没有跟随两个有效的十六进制数字时。例如,index.php?name=100% 会导致错误,因为末尾的 % 不是编码序列的有效开头。

4. URL 编码支持 Unicode 吗?

支持。现代 URL 编码(基于 UTF-8)通过先将字符转换为其 UTF-8 字节序列,然后对每个字节进行百分比编码来处理 Unicode。例如,字符 (UTF-8: E6 B1 89) 变为 %E6%B1%89

结论

URL 编码是确保 Web 数据完整性的简单但至关重要的工具。无论您是在构建 Web 应用程序、调试 API 调用,还是只是对 Web 的工作原理感到好奇,理解百分比编码都是必不可少的。

需要快速编码或解码字符串吗?使用我们的 URL 编码/解码工具,几秒钟内即可完成!