跳至内容

URL编码器:在线免费转义URL中的特殊字符

URL编码器可将文本转换为百分比编码格式,便于在网址中安全使用。它会把空格、特殊符号和Unicode字符转换成%XX形式的转义序列,采用与JavaScript中encodeURIComponent函数相同的编码规则,适用于构建API请求参数和处理包含非英文字符的国际化网址。

URL 字符串转义器

加载计算器...
📚

文档

URL 编码:它是什么以及如何工作

URL 编码也称为百分号编码,是一种仅使用少量安全 ASCII 字符来表示网址中字符的方法。它通过将不安全字符替换为一个 % 符号,后跟两位十六进制数字来实现。此 URL 字符串转义工具以与 JavaScript 内置 encodeURIComponent 函数相同的方式对文本进行编码。

URL 为什么需要编码

URL 只能包含有限的字符:字母、数字以及少量标点符号。空格、带重音符号的字母、非拉丁字母表中的字符,以及 & 或 = 等符号,如果未经编码出现在 URL 中,可能会破坏 URL 或改变其含义。例如,链接中的空格可能导致浏览器或服务器将 URL 读取为两个独立的部分。百分号编码会将这些字符替换为所有浏览器和服务器都能以相同方式读取的代码。

此工具保持不变的字符

此工具绝不会处理以下字符。它们会直接保留:

  • 大写和小写字母:A–Z、a–z
  • 数字:0–9
  • 标点符号 - . _ ~ ! * ' ( )

其他所有字符都会进行百分号编码,包括:

  • 空格字符,以及 : / ? # [ ] @ $ & + , ; = 等标点符号
  • 带重音符号的字母以及其他非 ASCII 或 Unicode 字符
  • 字面量 % 字符本身,它始终会变为 %25,即使它已经是百分号编码序列的一部分

一些介绍 URL 语法的通用指南会将 !、*、'、( 和 ) 与其他标点符号归为在某些上下文中“可能需要编码”的字符。此特定工具不会对它们编码,因为它遵循 encodeURIComponent 规则集,将这些字符视为安全字符。

如何计算百分号编码字符串(公式)

此工具逐个检查输入中的每个字符,并应用以下规则:

  1. 如果字符属于上面列出的保持不变的字符,则原样保留。
  2. 否则,将字符转换为 UTF-8 字节序列。带重音符号的拉丁字母、希腊字母、西里尔字母和阿拉伯字母使用两个字节。中文、日文和韩文字符使用三个字节。表情符号使用四个字节。
  3. 将每个字节写成两位十六进制数。
  4. 在每一对十六进制数字前加上 %。
  5. 按顺序连接结果,形成编码字符串。

计算示例

输入:Jürgen & Björk

逐个字符处理:

字符结果
JJ(保持不变)
ü%C3%BC(UTF-8 字节 0xC3、0xBC)
rgenrgen(保持不变)
(空格)%20
&%26
(空格)%20
BjBj(保持不变)
ö%C3%B6(UTF-8 字节 0xC3、0xB6)
rkrk(保持不变)

输出:J%C3%BCrgen%20%26%20Bj%C3%B6rk

第二个示例展示了保持不变字符集的作用。对字符串 -_.!~*'() 进行编码会得到 -_.!~*'(),文本完全相同,因为其中每个字符都属于非保留字符集。对字符串 100% 进行编码会得到 100%25,因为 % 符号本身不是安全字符。

如何解码百分号编码字符串

解码会反向执行这一过程:每个 %XX 序列都会被读取为一个十六进制字节,字节会重新组合成原始 UTF-8 字符,然后由该字符替换此序列。例如,%C3%BC 会被解码回 ü,而 %20 会被解码为空格。此工具只能编码;要反向执行该过程,需要使用单独的解码器。

常见用途

只要需要将人输入的文本,而不是程序员编写的文本,放入 URL,就会使用百分号编码:

  • 将搜索词放入地址栏的搜索框,例如 ?q=shoes%20%26%20bags
  • 携带姓名、地址或其他用户数据的查询参数
  • 链接到标题使用带重音字母或非拉丁文字的语言的页面
  • 将令牌或标识符作为 URL 一部分传递的 API 请求

代码示例

1// JavaScript
2encodeURIComponent("Jürgen & Björk");
3// "J%C3%BCrgen%20%26%20Bj%C3%B6rk"
4

Python 的 quote 始终保留字母、数字以及 - . _ ~。要与此工具匹配,必须将另外五个 字符 ! * ' ( ) 列入 safe。如果不列入 这些字符,quote 会改为返回 %21 %2A %27 %28 %29。

历史

在 URL 中对不安全字符进行编码的思想可以追溯到 (4,410 cm) 1994 发布的 RFC 1738,这是最早定义 URL 格式的文档之一。RFC 3986 于 2005 发布,更新了相关规则,并正式定义了始终无需编码的“非保留”字符集。此工具所基于的 JavaScript 函数 encodeURIComponent 遵循比 RFC 3986 略宽的非保留字符集:它还会保留 !、*、'、( 和 ) 不进行编码,这与 URI 规范的早期版本一致。

常见问题

URL 编码和 URL 转义有什么区别? 两者是同一回事。这两个术语都表示百分号编码,即将字符替换为 %,后跟两位十六进制数字。

为什么此工具中的 !、*、'、( 和 ) 保持不变? 此工具使用 encodeURIComponent,该函数将这五个字符视为安全字符,并完全按输入内容保留它们。其他编码函数以及某些服务器可能仍要求对它们进行编码,因此如果出现问题,应检查目标系统。

对于空格,%20 和 + 有什么区别? 两者都表示空格。%20 是空格通用的百分号编码形式。+ 符号是仅用于 application/x-www-form-urlencoded 数据的特殊形式,该格式用于 HTML 表单提交,而不是此工具。

此工具会解码已经编码的文本吗? 不会。它只能编码。如果输入中已经包含 % 符号,该 % 会被视为字面字符,并在输出中变为 %25,而不会保持不变。

中文或阿拉伯文等非拉丁字符如何处理? 每个字符首先会被转换为其 UTF-8 字节序列,然后每个字节都会进行百分号编码。一个中文字符使用三个字节,因此会生成三个 %XX 组。一个阿拉伯字母使用两个字节,因此会生成两个。

工具什么时候会拒绝对文本进行编码? 仅当文本包含代理项对的一半时。代理项对是用于存储 U+FFFF 以上字符的两部分代码,例如表情符号。单独的一半没有有效的 UTF-8 形式,因此工具会显示错误而不是结果。普通输入不会产生这种情况;它通常来自被截断的复制内容或损坏的链接。

应该对整个 URL 编码,还是只对其中一部分编码? 只对承载用户数据的部分编码,例如查询值或路径段;不要对构成 URL 结构的部分编码,例如 https:// 和域名。使用组件编码器对完整 URL 编码,还会将其中的 :、/ 和 ? 字符转换为百分号代码,从而破坏地址。

参考文献

  1. RFC 3986 — 统一资源标识符(URI):通用语法
  2. 百分号编码 — 维基百科
  3. MDN — encodeURIComponent()
  4. URL 标准 — WHATWG