toolfree

网址编码

在浏览器里把文字做百分号编码,同时列出 encodeURIComponent 与 encodeURI,让你选对那一个。

在你的浏览器中运行

还没有东西可以编码。

这件事有两个答案,这一页两个都给你

这是最值得避开的错误,也是为什么这里不替你做决定。

encodeURIComponent 会把分隔符号 : / ? & = # 一起转掉,因为它假设这段文字是要放 网址里的——当成查询参数,或路径的一段。如果那些字元原样保留,它们就会改变外层网址的 结构。

encodeURI 则保留它们不动,因为它假设你给的是一整个网址,只是需要整理一下——里面有 空白,或有中文字。

搞反了就是那个经典的错误:用 encodeURI 把一个网址塞进查询参数,它的 ?& 会并进 外层网址里,于是 ?next=https://x.com/a?b=1 悄悄地变成两个参数而不是一个。

状态列会在两者结果不同时告诉你,而那正是这个选择有意义的时候。

表单编码是第三种东西

HTML 表单送出空白时用的不是 %20,而是 +,而且从以前就是这样—— application/x-www-form-urlencoded 比现代的网址规则更早出现,之后也没有跟上。

这就是为什么解码那边有一个把 + 视为空白的选项。少了它,表单值解码出来会留下一堆真的 加号;而把它套用在一般网址上,又会把合法的 + 变成空白。光看字符串本身无法判断是哪一种, 所以它是一个开关,而不是一个猜测。

对已经编码过的东西再编码

%20 会变成 %2520,这是正确的而不是 bug:% 本身就是保留字元,把它编码是表示「一个真 正的百分号」的唯一办法。一个会自动跳过既有编码序列的工具,根本没办法编码 100%

如果你在网址里看到 %2520,就表示有东西被编码了两次。那就解码两次。

Emoji 与中文

两者都会编成 UTF-8 字节,所以一个中文字会变成三个百分号序列,大多数 emoji 会变成四个。 这是正常的。

不正常的、而且有些工具真的会做错的,是把一个字元从中间切开。任何 U+FFFF 以上的字元——大多数 emoji,以及像 𝕏 这样的字元——在内部是以代理对储存的,如果依索引而不是依字元来编码,就会产生 两个坏掉的半边,解码出来什么都不是。这里是依字元编码的。

没有任何上传

编码在这个页面里完成。这一点在这里特别重要:正在被除错的网址,常常带着权杖、工作阶段识别码 和 API 密钥。