Slug Generator

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+91CDE9 87 8D%E9%87%8D
庆U+5E86E5 BA 86%E5%BA%86
火U+706BE7 81 AB%E7%81%AB
锅U+9505E9 94 85%E9%94%85
空格U+002020%20
攻U+653BE6 94 BB%E6%94%BB
略U+7565E7 95 A5%E7%95%A5
èU+00E8C3 A8%C3%A8
ûU+00FBC3 BB%C3%BB
éU+00E9C3 A9%C3%A9

这个 URL 编码/解码工具把文本做百分号编码,让它能安全地放进 URL;也能把 %XX 转义还原成可读的文字。单个查询参数值或路径片段用 encodeURIComponent,完整网址用 encodeURI;可以逐行批量处理,还能看到每个转义背后的 UTF-8 字节。遇到无法解码的字符串,工具会告诉你是第几行、第几列、出了什么问题。全部在浏览器本地完成。

encodeURIComponent 和 encodeURI 的区别

两个函数都会把安全字符集之外的每个字符转成 UTF-8 字节,每个字节写成 % 加两位十六进制数字。区别在于哪些字符保持不变:

输入encodeURIComponentencodeURI
重庆火锅%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éeCr%C3%A8me%20Br%C3%BBl%C3%A9eCr%C3%A8me%20Br%C3%BBl%C3%A9e
Tom & JerryTom%20%26%20JerryTom%20&%20Jerry
50% off?50%25%20off%3F50%25%20off?
path/to/filepath%2Fto%2Ffilepath/to/file
https://example.com/搜索?q=咖啡 豆&page=2#tophttps%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%23tophttps://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,请用去除重音符号工具。

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 函数,你粘贴的内容不会离开你的设备。

不想让链接变成一串 %E4%B8%AD?

把标题转成简短的 ASCII slug,即使被百分号编码,链接也依然好读。