将特殊字符编码为安全的 URL 和查询字符串,或将百分号编码的字符串解码回可读文本。完全在浏览器中运行。
| Character | Encoded | Description |
|---|---|---|
| (space) | %20 | Space character |
| ! | %21 | Exclamation mark |
| # | %23 | Hash / fragment |
| $ | %24 | Dollar sign |
| & | %26 | Ampersand |
| ' | %27 | Apostrophe |
| + | %2B | Plus sign |
| / | %2F | Forward slash |
| = | %3D | Equals sign |
| ? | %3F | Question mark |
| @ | %40 | At sign |
URL 编码,正式称为百分号编码,是将 URL 中不允许或具有特殊含义的字符转换为使用百分号加两个十六进制数字的安全表示的过程。该机制由 RFC 3986(统一资源标识符)定义,确保 URL 在互联网上正确传输。例如,空格字符编码为 %20,和号编码为 %26,问号编码为 %3F。如果没有 URL 编码,浏览器和服务器会将这些字符误解为 URL 结构组件而非字面数据。
RFC 3986 定义了 URL 中两类字符。非保留字符——字母(A-Z,a-z)、数字(0-9)、连字符、下划线、句点和波浪号——可以在 URL 中直接出现而无需编码。保留字符如 : / ? # [ ] @ ! $ & ' ( ) * + , ; = 在 URI 语法中具有特殊的结构意义。当这些保留字符需要在 URL 组件(例如查询参数值)中作为字面数据出现时,必须进行百分号编码。编码过程将字符的 UTF-8 表示的每个字节转换为 %HH 形式,其中 HH 为该字节的十六进制值。多字节的 UTF-8 字符,如带音调的字母或表情符号,会产生多个百分号编码的三元组。
所有主流编程语言都提供了内置的 URL 编码函数。在 JavaScript 中,encodeURIComponent() 用于对字符串进行 URI 组件编码,而 encodeURI() 则在保留结构字符的同时对完整 URI 进行编码。Python 提供 urllib.parse.quote() 和 urllib.parse.urlencode()。PHP 有 urlencode() 和 rawurlencode()。了解何时以及如何使用 URL 编码对构建安全的 Web 应用至关重要——编码不当是常见的错误来源,且在未对用户输入进行消毒就直接放入 URL 时,可能导致注入漏洞。