跳到主要内容
PulsarKit

URL编码解码

对要放进URL的文本做百分号编码,或者把它解码回来;提供三种真正有区别的编码方案,列表会逐行处理。

把文件拖到这里

.txt · 最大5 MB

URL怎么编码和解码

  1. 1

    粘贴文本或URL列表

    一个值也行,五十个也行,每行一个。也可以用.txt文件,UTF-8和Windows-1251编码都能读取。

  2. 2

    选择编码或解码,以及编码方案

    单个值用组件编码(component),完整地址用完整URI,POST请求体用form-urlencoded。

  3. 3

    复制结果

    直接复制,或下载为文本文件,两种方式都会保留原来的行结构。

三种方案,选错为什么会让链接失效

组件编码会转义所有非保留字符,包括“: / ? # & =”。对于放进查询字符串的单个值,这是正确的;对于整个地址,就错了:把https://example.com/a?b=1按组件编码,每个结构字符都会变成百分号序列,得到的字符串就不再是URL。完整URI编码不动这些结构字符,只转义空格和非ASCII字符,输入本身已经是完整地址时,正需要这样。form-urlencoded就是组件编码再加一处替换:空格变成加号,这是HTML表单提交所用格式的要求。

加号的含义有歧义

在form-urlencoded请求体里,+表示空格;在路径片段里,+就是加号本身。仅凭字符串,解码无法区分这两种情况,所以这是一个设置,而不是靠猜:选择form-urlencoded,或打开“加号作空格”,加号就会变成空格;不打开则保持原样。编码在反方向上也有类似的陷阱:输入里的+必须先变成%2B,然后再把空格变成加号,否则经过一次编码再解码,它会悄悄变成空格。这里的顺序是固定的,所以先编码再解码,总能得到和原来完全一样的内容。

转义出错,准确指出位置

单独的%后面没有跟两位十六进制数字,或者像%E0%A4这样被截断的多字节序列,都会让字符串无法解码,而浏览器自带的解码函数只会抛出异常,不说明出错位置。严格模式会报告第一个问题所在的行和位置,方便在长列表里找到它;宽松模式把不成对的%当作普通百分号,返回其余内容,输入是日志行而不是真正的URL时,这通常正是你想要的。逐行处理也是出于同样的原因:五十条的列表里有一条出错,你能知道是哪一条。

文本留在这个标签页里

转换使用浏览器内置的编码函数,完全在本地运行。查询字符串里经常带有令牌和标识符,所以有必要说清楚:任何内容都不会上传、记录或保留。

常见问题

encodeURI和encodeURIComponent有什么区别?

encodeURIComponent还会转义结构字符“: / ? # & =”,适合查询字符串里的单个值。encodeURI保留这些字符,适合输入已经是完整地址、只需要让它能安全使用的情况。

为什么+有时表示空格?

因为HTML表单提交使用的form-urlencoded格式就是这样定义的。在URL的其他位置,+就是加号本身。仅凭字符串看不出适用哪一种,所以解码时把它作为一个明确的选项。

出现“无效的百分号编码”错误怎么办?

错误信息会指出第一处损坏的转义所在的行和位置,通常是本该写成%25的单独%,或者被截断的多字节序列。改正它,或者切换到宽松解码,取回其余的文本。

能批量处理URL列表吗?

能,而且这是默认方式。每一行单独转换,空行保持为空,换行符永远不会被转义,所以输入一个列表,输出的也是一个列表。

换行会保留吗?

逐行模式下会保留,包括末尾的换行符。关闭逐行模式后,整个输入作为一个值处理,其中的换行符在结果里会变成%0A。

地址里的西里尔字母怎么解码?

粘贴进来,用组件方案解码。像%D0%BF%D1%80%D0%B8这样经过百分号编码的UTF-8,会还原成原来的字母;来回转换在两个方向上都是无损的。

我的文本会发送到别的地方吗?

不会。编码和解码都使用浏览器内置的函数,在这个标签页里本地运行,不经过服务器,也不做任何存储。

相关工具