URL 编码 / 解码
对字符串进行百分号编码或解码,安全地用于 URL、查询参数和路径。
- 将要编码(或解码)的字符串粘贴到上方输入框。
- 对单个查询值或路径段选择 Component,对仅有少量不安全字符的完整 URL 选择完整 URL 模式。
- 点击「编码」或「解码」。结果会直接替换输入内容。
- 复制结果,或点击「清空」重新开始。
它能做什么?
URL(百分号)编码会把 URL 中不安全或含义不明确的字符替换为 %,后面跟上该字符 UTF-8 字节值的十六进制表示。Component 模式使用 encodeURIComponent(),会编码所有保留字符 —— 适用于嵌入到查询字符串或路径中的值。完整 URL 模式使用 encodeURI(),会保留像 :/?#&= 这类 URL 结构字符。
示例
输入:
hello world & café / 日本語 Component 编码:
hello%20world%20%26%20caf%C3%A9%20%2F%20%E6%97%A5%E6%9C%AC%E8%AA%9E 完整 URL 编码:
hello%20world%20&%20caf%C3%A9%20/%20%E6%97%A5%E6%9C%AC%E8%AA%9E 注意完整 URL 模式保留了 & 和 /,因为它们在 URL 中具有结构含义。
常见错误与注意事项
大多数编码问题来自模式选择错误,或在同一个输入上运行两次。下面列出最常见的情况。
- 对查询值使用 encodeURI。 encodeURI("a&b=c") 会返回 a&b=c(未变动),导致查询字符串被破坏。对值请使用 Component 模式(encodeURIComponent)。
- 重复编码。 再次对 hello%20world 编码会得到 hello%2520world。先解码,或跳过一层。
- 忘了处理 #。 查询值中的 # 如果不编码为 %23,会被当作片段(fragment)的开始。
- + 号混淆。 + 在表单编码正文中表示空格,但在 URL 路径或查询中就是字面上的 +。要在查询值中传真正的加号,请编码为 %2B。
- 格式错误的百分号序列。 未编码的 % 会让 decodeURIComponent 抛出 "URI malformed"。要么把 % 编码为 %25,要么在解码前去掉孤立的 %。
- UTF-8 与 Latin-1 旧服务器。 本工具始终使用 UTF-8。一些很旧的系统期望 Latin-1 / windows-1252 —— 那里 é 是 %E9,而不是 %C3%A9。如果出现乱码,说明对端不是 UTF-8。
常见问题
encodeURI 与 encodeURIComponent 有什么区别?
encodeURIComponent 会转义除字母、数字以及 -_.!~*'() 之外的所有字符,适用于单个查询值和路径段。encodeURI 会保留 URL 保留字符 :/?#&=,因此用于对已经具有结构的完整 URL 进行编码。95% 的情况下使用 Component;只有在 URL 基本合法、只是包含零星的空格或 Unicode 时才使用完整 URL。
查询字符串中究竟哪些字符需要编码?
值中的查询分隔符 & 和 = 必须编码,否则会看起来像分隔符。空格会变成 %20 或 +。片段标记 # 必须编码。另外还有 /、?、所有非 ASCII 字符以及控制字符。encodeURIComponent 会处理所有这些;encodeURI 则保留 &、=、/、?、# 不动,因为它们是 URL 结构字符。
为什么我的 URL 被重复编码了?
重复编码发生在对已经编码的值再编码一次。空格先变成 %20,然后 % 本身又变成 %25,结果是 %2520。通常是因为把已编码的 URL 再次传给 encodeURIComponent,或者框架在你手动编码之上又自动编码一次。先解码一次再干净地重新编码,或跳过一层。
本工具如何处理表情符号或带重音的字母等非 ASCII 字符?
JavaScript 的编码器会先把非 ASCII 字符转换为 UTF-8 字节,再对每个字节进行百分号编码。因此 é 变成 %C3%A9(两个字节),而像 😀 这样的表情符号变成 %F0%9F%98%80(四个字节)。解码则是反过来的过程。这是 RFC 3986 的标准行为,适用于所有现代服务器。
为什么解码会失败并提示 "URI malformed"?
decodeURIComponent 在遇到无效的百分号序列时会抛错 —— 比如 % 后面没有跟上两位十六进制数字(例如 %ZZ 或单独一个 %),或者 UTF-8 字节序列不合法(例如 %C3 没有有效的后续字节)。常见原因是输入里有从未被编码的 %,或者字符串已经被解码过一次但仍含有百分号。
空格应该变成 + 还是 %20?
两种都能见到。%20 在任何地方都是正确的 —— 路径、查询字符串和片段中都可用。+ 表示空格的简写仅在 HTML 表单提交所用的 application/x-www-form-urlencoded 格式中成立。本工具沿用 encodeURIComponent,使用 %20。如果确实需要 +,在编码后把 %20 替换为 + 即可。