URL 在线编码解码

在线 URL 编码解码工具,把中文、空格与特殊字符转成 %E4%B8%AD 这样的百分号编码,也能反向还原;支持参数值与整条网址两种编码口径,解码会指出出错位置并区分 UTF-8 与 GBK,全部在浏览器本地完成,内容不上传。

逐字符对照(只在编码方向显示):看清楚哪个字被换成了哪几个字节
原始字符码点UTF-8 字节编码结果
全部计算在浏览器本地完成,内容不会上传到服务器。

这个工具能做什么

它把「不能在网址里直接出现的字符」换成可以安全传输的写法,也能把这种写法还原回原文。所有计算都在你自己的浏览器里完成,输入的内容不会发到任何服务器。

三种常见场景,口径该怎么选

场景一:要给某个参数配一个值(搜索词、文件名、令牌、带中文的查询条件)。用默认的「参数值」口径。它会把和号、等号、问号、斜杠这些符号也一起编码,这样服务器解析时才不会把一个参数错拆成两个。这是最常用的场景,拿不准就选它。

场景二:手上是一条完整网址,只想把里面的中文和空格处理掉。选「整条网址」口径。它会保留冒号、斜杠、问号、和号、等号、井号这些网址自身的语法符号,只处理中文和空格这类不能直接出现的字符,整条链接贴到浏览器里仍然能打开。

场景三:拿到一串看不懂的百分号编码要还原。切到解码方向。如果这串来自表单提交或查询串(常见特征是里面出现了加号),把「加号的含意」切到「加号代表空格」;如果是网址路径或一段普通文本,保持默认的「加号就是加号」,以免把真实的加号吃掉。

为什么中文会变成 %E4%B8%AD 这样的东西

网址里只允许出现一小部分 ASCII 字符,其余字符必须换一种写法。以一个常用汉字为例,过程分两步:先把「中」按 UTF-8 编成三个字节 E4、B8、AD,再把每个字节写成「百分号 + 两位十六进制」,得到 %E4%B8%AD。所以一个汉字编码后是 9 个字符(3 个字节,每个字节占 3 个字符),emoji 通常占 4 个字节,编码后是 12 个字符。这也是为什么把一段中文放进网址后链接会突然变得很长——它没有变复杂,只是换了一种写得更长的表示法。

逆向操作要做两件事:先把每三位一组还原成字节,再把字节按 UTF-8 解回文字。解码失败通常就卡在这两步中的一步,所以本工具把两类错误分开提示:百分号后面不是两位十六进制,属于写法问题;字节拼起来不是合法 UTF-8,属于编码来源问题。后者在国内很常见,因为不少老系统用的是 GBK,「中」在 GBK 里是 %D6%D0,和 UTF-8 的 %E4%B8%AD 完全不同。

常见字符对照

一个实用习惯:如果一段文本里本来就有单独的百分号(例如「增长了 100%」),要编码时先把那个百分号写成 %25,否则解码方看到百分号后面不是十六进制就会报错。

关于数据安全

编码和解码全部由页面里的 JavaScript 完成,输入内容不会上传,也没有账号和登录。这一点对处理接口返回、调试参数、临时查看一串可疑链接尤其重要:可以直接粘进来,关掉页面后不会留下记录。唯一需要注意的是,本页面本身是公开可访问的网址,请不要把密码、身份证号等敏感信息粘到任何在线工具里——包括本站。

常见问题

URL 编码和 Base64 有什么区别?

两者要解决的问题不同。URL 编码(百分号编码)解决的是「这些字符不能直接出现在网址里」,它把每个字节写成百分号加两位十六进制,结果仍然保留了原文的结构,像 %E4%B8%AD 一眼就知道是三个字节;Base64 解决的是「二进制数据要塞进纯文本通道」,它按 3 字节一组重新映射到 64 个字符上,体积变成约 1.33 倍,但看不出原文结构。两者都不是加密,拿到字符串谁都能还原,所以都不能用来保存密码。

为什么中文编码后变成 %E4%B8%AD 这样的东西?

因为网址里只允许出现一小部分 ASCII 字符,中文必须换一种写法。过程分两步:先把「中」按 UTF-8 编成三个字节 E4 B8 AD,再把每个字节写成百分号加两位十六进制,于是得到 %E4%B8%AD。一个常用汉字在 UTF-8 里正好是 3 个字节,所以中文编码后长度大约是原来的 9 倍(3 个字节,每个字节写成 3 个字符);emoji 通常占 4 个字节,编码后是 12 个字符。页面上的逐字符对照表会把这笔账一行一行列出来。

编码后的加号变成了空格(或空格变成了加号)是怎么回事?

这是表单编码留下的历史习惯:在老式的表单提交(application/x-www-form-urlencoded)里,空格被写成加号,而真正的加号必须写成 %2B。所以同一个加号在两种语境下含义正好相反,查询串里它常常代表空格,而路径里它就是加号本身。本工具默认把加号当普通字符处理,不会悄悄还原成空格;如果你解的是表单提交或查询串,请在「解码时加号的含意」里切到「加号代表空格」。最稳妥的做法是编码时就用 %20 表示空格、用 %2B 表示加号,这样谁都不会误解。

解码提示「不是合法的 UTF-8 序列」是什么原因?

意思是这一串里的百分号编码写法都对(每个百分号后面确实是两位十六进制),但这些字节拼起来不构成一个合法的 UTF-8 字符,所以没有对应的文字。最常见的原因有两个:一是原文用 GBK 编码,例如「中」在 GBK 里是 %D6%D0,在 UTF-8 里是 %E4%B8%AD,前者用本工具解不出来;二是字符串被截断了,末尾少了一个字节,比如 %E4%B8 只有两个字节,凑不成一个汉字。这两种情况都要回到源头改编码或补全字符串,本工具不会硬猜一个结果给你。

encodeURI 和 encodeURIComponent 有什么区别,该用哪个?

区别在于保留哪些字符。encodeURI 会保留井号、美元号、和号、加号、逗号、斜杠、冒号、分号、等号、问号、at 号这些在网址里有语法含义的符号,适合编码一整条已经拼好的网址;encodeURIComponent 会把它们全部编码,适合编码某个参数的值。判断标准很简单:这段内容如果是网址结构的一部分(协议、主机、路径分隔符、参数分隔符),就用它自己的符号原样保留;如果是用户填的一个值(搜索词、文件名、令牌),就用默认的「参数值」口径整个编码。用反了会出真问题:把带和号的参数值按整条网址编码,和号不会被转义,服务器会把一个参数拆成两个。

← 返回全部工具