encodeURIComponent · encodeURI
URL 编码/解码工具(URL Encoder/Decoder)
把文本百分号编码后放进 URL,或把 %XX 转义还原成可读文字。可选 encodeURIComponent 或 encodeURI,支持逐行批量,显示 UTF-8 字节,解码失败时给出明确的错误位置。
- 100% 浏览器本地运行
- 与 JavaScript 输出一致
- 双重编码检测
在浏览器本地处理 · 不上传任何内容
用于查询参数值、路径片段或表单字段:除 A–Z a–z 0–9 - _ . ! ~ * ' ( ) 外全部编码
UTF-8 百分号编码预览
每个被编码的字符及其 UTF-8 字节。
| 字符 | 码位 | UTF-8 字节 | 编码结果 |
|---|---|---|---|
| 重 | U+91CD | E9 87 8D | %E9%87%8D |
| 庆 | U+5E86 | E5 BA 86 | %E5%BA%86 |
| 火 | U+706B | E7 81 AB | %E7%81%AB |
| 锅 | U+9505 | E9 94 85 | %E9%94%85 |
| 空格 | U+0020 | 20 | %20 |
| 攻 | U+653B | E6 94 BB | %E6%94%BB |
| 略 | U+7565 | E7 95 A5 | %E7%95%A5 |
| è | U+00E8 | C3 A8 | %C3%A8 |
| û | U+00FB | C3 BB | %C3%BB |
| é | U+00E9 | C3 A9 | %C3%A9 |
这个 URL 编码/解码工具把文本做百分号编码,让它能安全地放进 URL;也能把 %XX 转义还原成可读的文字。单个查询参数值或路径片段用 encodeURIComponent,完整网址用 encodeURI;可以逐行批量处理,还能看到每个转义背后的 UTF-8 字节。遇到无法解码的字符串,工具会告诉你是第几行、第几列、出了什么问题。全部在浏览器本地完成。
encodeURIComponent 和 encodeURI 的区别
两个函数都会把安全字符集之外的每个字符转成 UTF-8 字节,每个字节写成 % 加两位十六进制数字。区别在于哪些字符保持不变:
| 输入 | encodeURIComponent | encodeURI |
|---|---|---|
重庆火锅 | %E9%87%8D%E5%BA%86%E7%81%AB%E9%94%85 | %E9%87%8D%E5%BA%86%E7%81%AB%E9%94%85 |
Crème Brûlée | Cr%C3%A8me%20Br%C3%BBl%C3%A9e | Cr%C3%A8me%20Br%C3%BBl%C3%A9e |
Tom & Jerry | Tom%20%26%20Jerry | Tom%20&%20Jerry |
50% off? | 50%25%20off%3F | 50%25%20off? |
path/to/file | path%2Fto%2Ffile | path/to/file |
https://example.com/搜索?q=咖啡 豆&page=2#top | https%3A%2F%2Fexample.com%2F%E6%90%9C%E7%B4%A2%3Fq%3D%E5%92%96%E5%95%A1%20%E8%B1%86%26page%3D2%23top | https://example.com/%E6%90%9C%E7%B4%A2?q=%E5%92%96%E5%95%A1%20%E8%B1%86&page=2#top |
- encodeURIComponent 只保留
A–Z a–z 0–9 - _ . ! ~ * ' ( )。凡是放进 URL 内部的内容都该用它:查询参数值、路径片段、表单字段。&、=、?、/、#这些字符会被编码,不会把 URL 拆坏。 - encodeURI 还额外保留
; , / ? : @ & = + $ #,所以完整 URL 编码后仍然能用。千万别用它编码单个值:Tom & Jerry里的&会原样留下,把查询字符串拆成两段。
一个汉字占 3 个 UTF-8 字节,编码后变成 9 个字符;带重音的拉丁字母占 2 个字节。可读的 ASCII slug 就没有这个问题,参见如何音译 slug。
空格:%20 还是 +?
在 URL 路径里以及用 encodeURIComponent 时,空格是 %20。HTML 表单以 application/x-www-form-urlencoded 格式提交数据,空格写成 +,真正的加号写成 %2B:a b+c 会变成 a+b%2Bc。编码或解码表单数据时,打开「空格转为 +」。不打开时,解码会把 + 当作加号保留,与 decodeURIComponent 完全一致。
为什么会解码失败
decodeURIComponent 遇到两类输入会抛出 URIError,本工具会改为报告准确位置:
- % 后面没有两位十六进制数字。
100%或%zz都不是有效转义。如果原意是字面的百分号,应该编码成%25。 - 字节不是 UTF-8。
%E4%B8是被截断的汉字(需要 3 个字节),caf%E9则是用 Latin-1 而不是 UTF-8 编码的。请把原文重新按 UTF-8 编码,或补全被截断的部分。
打开「逐行处理」时,失败的行原样保留,其余各行照常解码。
双重编码
对已经编码过的字符串再编码一次,每个 % 都会变成 %25:é 编码成 %C3%A9,再编码就成了 %25C3%25A9。常见原因是你的代码编码了一次,库或 CMS 又编码了一次。当你编码的文本里已经有转义时,工具会提醒;解码后的文本看起来仍是编码状态时,会提供「彻底解码」,反复解码直到不再变化:caf%25C3%25A9 → caf%C3%A9 → café。
代码:在 JavaScript、Python 和 PHP 里得到同样的编码
下面的函数与工具输出完全一致(已对每个测试字符串逐一核对):
// Query values, path segments, form fields: encode everything except A-Z a-z 0-9 - _ . ! ~ * ' ( )
encodeURIComponent('Café & Bar?'); // 'Caf%C3%A9%20%26%20Bar%3F'
decodeURIComponent('Caf%C3%A9'); // 'Café' (throws URIError on bad input such as '100%')
// A whole URL: keeps ; , / ? : @ & = + $ # so the URL still works
encodeURI('https://example.com/a b?q=café'); // 'https://example.com/a%20b?q=caf%C3%A9'from urllib.parse import quote, unquote
def encode_uri_component(s): # same output as JavaScript's encodeURIComponent
return quote(s, safe="-_.!~*'()")
def encode_uri(s): # same output as JavaScript's encodeURI
return quote(s, safe="-_.!~*'();,/?:@&=+$#")
def decode_uri_component(s): # raises on invalid UTF-8 such as '%E9'; a stray '%' is kept as is
return unquote(s, errors='strict')<?php
// rawurlencode() also encodes ! * ' ( ); put them back to match encodeURIComponent exactly.
function encode_uri_component(string $s): string {
return strtr(rawurlencode($s), ['%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')']);
}
function decode_uri_component(string $s): string {
return rawurldecode($s); // keeps "+" as "+"; use urldecode() for form data
}做 URL slug 时其实很少需要编码:URL Slug 生成器 会把标题转成用连字符连接的小写 ASCII 单词,根本不需要转义。如果只想去掉文本里的重音而不生成 slug,请用去除重音符号工具。
参考来源
- MDN:encodeURIComponent() 和 encodeURI()
- RFC 3986:Uniform Resource Identifier,第 2 节 Characters
- Python 文档:urllib.parse.quote()
FAQ
常见问题
什么是 URL 编码?
URL 编码也叫百分号编码,把 URL 里不允许出现的字符写成 UTF-8 字节,每个字节用 % 加两位十六进制数字表示。空格变成 %20,é 变成 %C3%A9。
什么时候用 encodeURIComponent,什么时候用 encodeURI?
编码 URL 的某一部分(比如查询参数值或路径片段)用 encodeURIComponent。只有整个 URL 需要保留 /、?、&、# 的作用时,才用 encodeURI。
为什么会出现「URIError: URI malformed」?
文本里有 % 后面没跟两位十六进制数字(比如 100%),或者转义不是有效的 UTF-8(比如 %E4%B8)。工具会显示第一个问题所在的行和列。
双重编码的 URL 怎么修?
反复解码,直到不再变化。像 caf%25C3%25A9 需要解码两次,「彻底解码」按钮会自动完成。
空格应该是 %20 还是 +?
URL 路径里以及用 encodeURIComponent 时用 %20。只有以 application/x-www-form-urlencoded 提交的表单数据和查询字符串里,+ 才表示空格。
我的文本会被发送到服务器吗?
不会。编码和解码用的是浏览器自带的 JavaScript 函数,你粘贴的内容不会离开你的设备。
