URL 编码与解码指南:百分号编码、空格与 UTF-8
ToolMellow ·
URL 编码用百分号转义表示特定字节,使文本适合 URL 的指定部分或表单值。ToolMellow 提供三种方式:URL 组成部分、表单值和完整 URL。粘贴文本,选择方式,然后点击“编码”或“解码”。转换在本地进行,不会打开、请求或验证地址。
正确结果取决于文本的用途。单个查询值、完整查询字符串和已经拼好的 URL 是不同输入。本指南提供准确示例,说明 UTF-8 和常见错误,帮助你避免改变分隔符或解码超出预期的层数。示例地址与输出仅用于说明,没有请求这些资源。
如何编码或解码 URL 文本
打开 URL 编码与解码工具,粘贴要转换的完整值。在“编码方式”中选择“URL 组成部分(空格用 %20)”“表单值(空格用 +)”或“完整 URL(保留分隔符)”。“编码”和“解码”处理编辑器中的全部输入;仅输入文字不会触发转换。
使用“复制结果”或“下载”前先检查输出。“将结果用作输入”可让符合输入上限的结果接受下一步操作。修改输入或编码方式会清除旧结果。“自动换行”只改变显示换行,不会插入换行符或改变百分号转义。
- 对于单个查询值或路径段,选择组成部分方式,不要编码整个已拼接查询。
- 只有接收格式需要 application/x-www-form-urlencoded 的值规则时,才使用表单值方式。
- 对于分隔符应保留结构意义的已拼接地址,可考虑完整 URL 方式;它仍不是 URL 解析器或验证器。
选择组成部分、表单值或完整 URL
组成部分编码可防止值中的保留标点被当成 URL 结构。表单值方式使用单个值的表单编码规则,不输出参数名。完整 URL 方式保留文本中的冒号、斜杠、问号、与号、等号和片段标记等分隔符。
根据接收应用选择方式,而不是选择看起来最短的输出。把完整查询编码成单个值,或把值中的分隔符保留为裸字符,都可能改变含义。本工具不会把粘贴的查询拆成名称和值,也不会判断哪一部分属于主机、路径、查询或片段。
| 方式 | 适用输入 | 实现边界 |
|---|---|---|
| URL 组成部分 | 单个查询值或路径段 | 转义保留标点;额外严格转义五个标点 |
| 表单值 | 单个表单编码值 | 用 URLSearchParams 编码;解码时先替换字面 + 再严格解码百分号转义 |
| 完整 URL | 已经拼接的地址 | encodeURI/decodeURI;保留自身的保留字符集合,不全面验证 URL |
RFC 3986:URI 语法、非保留字符与百分号编码WHATWG URL:表单 URL 编码解析与序列化ECMAScript:encodeURI 和 decodeURI
百分号编码如何表示字节
百分号转义由百分号和两个十六进制数字组成,表示一个字节。Unicode 字符可能需要多个 UTF-8 字节,因此一个可见字符可能对应多个转义。ASCII 空格的十六进制值为 20,在组成部分和完整 URL 编码中表示为 %20;表单编码把它表示为 +。
这些固定示例说明为什么必须选择正确方式。字面加号与编码后的空格是不同值。第三行中的斜杠和查询标点在一种方式中属于组成部分的数据,在完整 URL 方式中则保留结构作用。两种操作都不会请求地址。
| 输入文本 | 组成部分输出 | 表单值输出 | 完整 URL 输出 |
|---|---|---|---|
a b+c | a%20b%2Bc | a+b%2Bc | a%20b+c |
café | caf%C3%A9 | caf%C3%A9 | caf%C3%A9 |
a/b?x=1#part | a%2Fb%3Fx%3D1%23part | a%2Fb%3Fx%3D1%23part | a/b?x=1#part |
~* | ~%2A | %7E* | ~* |
😀 | %F0%9F%98%80 | %F0%9F%98%80 | %F0%9F%98%80 |
RFC 3986:URI 语法、非保留字符与百分号编码WHATWG Encoding:UTF-8 与文本解码WHATWG URL:表单 URL 编码解析与序列化ECMAScript:encodeURI 和 decodeURI
组成部分方式与严格转义
ToolMellow 的组成部分编码使用 encodeURIComponent,并额外转义 !、单引号、(、) 和 *。其保持原样的 ASCII 字符只有字母、数字及 -._~。这比原始 encodeURIComponent 更接近 RFC 3986 的非保留字符集合;原函数会保留这五个额外标点。
例如,值 red&blue=1 变成 red%26blue%3D1。可将其作为参数值,而不会让其中的与号成为另一条查询分隔符。组成部分解码使用 decodeURIComponent:转义的保留字符会被解码,字面 + 仍是加号。它不会解析查询键值对或规范化完整 URL。
RFC 3986:URI 语法、非保留字符与百分号编码ECMAScript:encodeURIComponent 和 decodeURIComponent
表单值:加号、空格、波浪号和星号
表单值编码使用 URLSearchParams 对单个值进行序列化。空格变成 +,字面加号变成 %2B,字面星号保持原样。波浪号变成 %7E。这些差异符合预期:表单编码有自己的允许字符集合,与组成部分方式不完全相同。
解码先把字面加号替换为空格,再调用严格的 decodeURIComponent。因此 a+b%2Bc 变成 a b+c:%2B 在最初替换之后才解码为加号,不会再变成空格。这是值解码器,不是容错的 URLSearchParams 查询解析器。畸形转义和无效的百分号编码 UTF-8 会报错,不会自动修复。
WHATWG URL:表单 URL 编码解析与序列化ECMAScript:encodeURIComponent 和 decodeURIComponent
完整 URL 方式保留分隔符和保留字符转义
完整 URL 编码使用 encodeURI。它保留已拼接地址中的分隔符,同时转义空格及其他需要转义的文本。例如,https://example.com/a b?q=a+b#part 变成 https://example.com/a%20b?q=a+b#part。这一步保留加号;应用之后如何解析查询是另一项操作。
完整 URL 解码使用 decodeURI,保留其自身保留字符集合 ;/?:@&=+$,# 的转义。例如,%2F、%26 和 %23 保持转义,%20 变成空格。这个较早的集合并不包括 RFC 3986 的所有保留字符:%5B 和 %5D 会解码为方括号,而完整 URL 编码会对字面方括号进行百分号转义。完整 URL 方式不会解析 URL、验证主机或协议、规范化 IPv6 主机、通过 IDNA 转换域名或请求地址。
ECMAScript:encodeURI 和 decodeURIWHATWG URL:URL 解析、主机及 URLSearchParamsRFC 3986:URI 语法、非保留字符与百分号编码
UTF-8、Unicode 与原始输入的区别
编码将需要转义的字符转换为 UTF-8 字节再进行百分号转义。在 café 中,最后一个字母需要两个 UTF-8 字节,用 %C3%A9 表示;表情 😀 使用四个字节。编辑器上限计算 JavaScript 的 UTF-16 代码单元,因此字节数、代码单元数和可见字符数不一定相同。这种转换不会规范化 Unicode 文本。
所有编码方式都会拒绝未配对的 Unicode 代理项。完整 URL 解码也先检查原始输入是否为格式完整的 Unicode。组成部分和表单值解码不做这一项单独的原始字符串检查:未转义的字面代码单元可直接保留,百分号编码的字节序列则必须解码为有效 UTF-8。成功解码不表示已全面验证每个字面字符或 URL 安全性。
ECMAScript:encodeURIComponent 和 decodeURIComponentECMAScript:encodeURI 和 decodeURIECMAScript:String isWellFormedWHATWG Encoding:UTF-8 与文本解码
畸形转义、无效 UTF-8 与意外输出
每个百分号后必须恰好有两个十六进制数字,转义字节序列还须满足解码器的 UTF-8 规则。要编码的字面百分号变成 %25;解码输入中孤立的百分号会报错。工具不会悄悄去除空白,也不会重复解码直到文本看起来可读。
修改字符前先检查方式和完整原始值。原始空格或换行符也是输入数据,可能改变编码结果。如果复制了 HTML 属性、带引号的 JSON 字符串或完整请求体,应先单独解析外层格式。它们的分隔符和转义规则不会自动变成百分号编码规则。
| 输入或现象 | 原因 | 下一步检查 |
|---|---|---|
% 或 %2 | 不完整百分号转义 | 检查复制的完整值 |
%GG | 转义数字不是十六进制 | 检查原始生成方 |
%FF | 转义字节不是有效 UTF-8 | 确定预期字符编码或二进制范围 |
组成部分方式中 a+b 保留加号 | 该方式不把字面加号当空格 | 只有接收方需要时才用表单值方式 |
完整 URL 解码保留 %2F | decodeURI 保留该分隔符 | 对合适的单个值使用组成部分解码 |
ECMAScript:encodeURIComponent 和 decodeURIComponentECMAScript:encodeURI 和 decodeURIRFC 3986:URI 语法、非保留字符与百分号编码
%25 的来源,以及何时不该再次解码
编码已经编码过的百分号会增加一层:组成部分编码把 %2F 变成 %252F。对 %252F 进行一次组成部分解码得到 %2F,再次解码得到 /。每一步改变一层编码。仅出现 %25 不能证明有错误,因为应用可能有意把编码文本放在另一个值中。
确认应用需要哪一层,而不是重复解码直到出现标点。第二次组成部分解码可能把数据变成具有结构意义的斜杠或分隔符。完整 URL 解码可以有意保留这些转义分隔符,所以组成部分示例并不表示所有方式都能重复移除所有转义。本工具不了解应用的路由或授权规则。
RFC 3986:URI 语法、非保留字符与百分号编码ECMAScript:encodeURIComponent 和 decodeURIComponentECMAScript:encodeURI 和 decodeURI
查询字符串、路径段与应用安全使用
对于查询参数,把参数名和查询结构与参数值分开。URL、URLSearchParams 等地址构建 API 可以帮助拼接和序列化实际地址。本工具只转换提供的文本,不验证主机名,不缩短链接,不跟随重定向,也不决定应用应允许哪种协议。
百分号编码是可逆表示,不是加密、哈希、HTML 转义或授权。编码危险协议不会让链接可信,解码值也不会使其适合直接插入 HTML 或可执行代码。使用目标上下文所需的验证与转义规则,避免在共享示例 URL 中包含真实机密。
WHATWG URL:URL 解析、主机及 URLSearchParamsWHATWG URL:表单 URL 编码解析与序列化RFC 3986:URI 语法、非保留字符与百分号编码
输入限制、输出增长与本地文本文件
输入上限是 1,000,000 个 UTF-16 代码单元,不是一百万个 UTF-8 字节或可见字素。转义可能增长输出:一百万个 ASCII 空格在组成部分方式中产生三百万个字符。超过输入上限的输出仍可复制和下载,但“将结果用作输入”无法载入过大的结果。可用浏览器内存仍是实际限制。
打开本地文件通过 File.text() 读取 UTF-8 文本。大于或等于 4,000,000 字节的文件会被拒绝;读取后超过 1,000,000 个 UTF-16 单元的文本也会被拒绝。普通文本读取会去掉开头的 UTF-8 BOM,并替换畸形 UTF-8 序列,因此不是逐字节无损的二进制编码,也不是任意字符集解码。文件扩展名不能证明编码类型。
W3C File API:读取 Blob 文本WHATWG Encoding:UTF-8 与文本解码ECMAScript:String isWellFormed
复制、文本下载、清空与隐私
“下载”将结果作为 UTF-8 文本保存到 toolmellow-result.txt,不是请求、报告或打开的网页。成功的空转换仍会启用“复制结果”和“下载”。若无法访问剪贴板,可选择输出并手动复制。简单检查时,编码已知文本,在结果符合上限时复用它,再按同一方式解码。
“清空”重置输入、结果、错误、查找和替换内容及编辑器历史,同时保留“编码方式”和“自动换行”。工作内容留在页面内存中,不是账户历史。刷新或关闭工作区会丢弃该工作状态;下载文件仍留在设备上。“清空”不保证彻底清除浏览器或操作系统内存中的可恢复痕迹。
转换在本地浏览器工作线程中运行,不会把输入的 URL 文本、所选文件内容或结果发给转换服务器。加载网站仍向主机发送常规请求元数据,网站也使用 Google Analytics 统计页面访问,包括 Cookie 和浏览器、设备信息。本地转换不表示匿名、零流量或基础设施零日志;请参阅网站隐私页面。
嵌入 URL 编码与解码工具并保留反向链接
选择页面语言,打开工作区下方的集成部分。将提供的 HTML 代码复制或下载到允许外部 iframe 和脚本的网站区域。代码包含 ToolMellow 工作区 iframe、尺寸调整脚本,以及返回对应语言 ToolMellow 工具页面的可见反向链接。请保留这一署名链接。
在窄屏预览嵌入内容,并确认平台支持剪贴板权限和外部资源。嵌入版有相同的三种方式、文本范围和限制,不是服务器转换 API 或 URL 请求服务。提供的链接使用 nofollow 和 noopener,因此不能保证提高搜索排名。
常见问题
如何为 URL 编码文本?
按目标选择方式:单个值或路径段用 URL 组成部分,表单序列化用表单值,需要保留分隔符的已拼接地址用完整 URL。粘贴文本并点击“编码”。工具不会打开地址。
如何解码 URL 编码值?
选择匹配方式并点击“解码”。组成部分和表单值严格解码百分号编码的 UTF-8;表单值还先把字面加号变为空格。完整 URL 保留其自身保留字符集合的转义。它不把查询解析为键值对。
URL 中的加号何时表示空格?
在本工具中,只有表单值解码把字面加号变为空格。组成部分和完整 URL 解码保留字面加号。application/x-www-form-urlencoded 解析有自己的加号规则,并不适用于所有 URL 组成部分。
%20 和 + 有什么区别?
%20 是 ASCII 空格字节的百分号转义。表单序列化用加号表示空格,用 %2B 表示字面加号。接收格式决定是否应把加号解释为空格。
为什么完整 URL 解码保留 %2F?
完整 URL 方式使用 decodeURI,保留其自身集合 ;/?:@&=+$,# 的转义,包括斜杠、与号和片段标记。这并非 RFC 3986 的全部保留字符:方括号转义会解码为方括号。组成部分方式也解开那些分隔符转义。按地址中目标部分选择方式,不要将完整 URL 方式用作 IPv6 主机规范化工具。
本工具与 encodeURIComponent 有何不同?
ToolMellow 组成部分方式额外转义感叹号、单引号、圆括号和星号。只有字母、数字和 -._~ 保持原样。表单值和完整 URL 使用不同序列化规则,不是可互换的别名。
为什么 URL 解码失败?
不完整或非十六进制转义,以及无效的百分号编码 UTF-8 都会报错。检查原值、预期方式和外层格式。工具不会修复畸形转义或默默选用另一种字符编码。
解码时是否总会验证 Unicode?
不会。完整 URL 解码检查原始输入的 Unicode 格式;组成部分和表单值解码不会单独检查未转义的字面代码单元。百分号编码字节序列按 UTF-8 严格解码。成功解码不表示完整验证 URL。
为什么 URL 中出现 %25?
%25 表示百分号。对编码文本再次编码时可能出现,例如组成部分方式把 %2F 变成 %252F。确认所需层数;重复解码可能把数据变成结构标点。
能在表单值方式中粘贴完整查询字符串吗?
工具将其当作单个值,不是一系列参数对。编码会转义值内部的分隔符;解码不提取名称和值。请使用合适的 URL 或查询解析器处理完整查询结构。
能编码本地文件或复用过大输出吗?
文件控件从小于 4,000,000 字节的文件读取 UTF-8 文本,允许最多 1,000,000 个 UTF-16 输入单元。这不是原始二进制文件编码。输出可更长且仍能复制或下载,但过大输出无法复用为输入。
URL 编码是加密吗?
不是。百分号编码是可逆表示,不增加保密性或授权,也不是哈希、HTML 转义或 URL 安全保证。使用目标上下文要求的验证和转义规则。
能在网站中嵌入 URL 编码与解码工具吗?
使用工作区下方的本地化 HTML 代码,保留可见的 ToolMellow 反向链接,并确认 iframe、脚本支持。嵌入版有相同的三种方式和本地文本限制,不是服务器转换 API 或 URL 请求服务。