URL编码
对文本进行百分号编码,让它能完好地放进URL。三种不同的编码对应三种不同的用途,选错了,值就会悄无声息地被破坏——所以页面会告诉您该选哪一种。
- 绝不存储
- 无需排队,无需等待
- 无需注册,无水印
编码结果将显示在这里。
使用方法
粘贴文本
任何文本,任何语言都可以。按UTF-8编码,这也是所有现代服务器所期望的。
选择用途
放进查询字符串的单个值、已拼好的完整URL,或表单提交。区别很重要,每一种都有说明。
复制结果
如果有一整份列表要一次处理,可以逐行编码。
三种正确答案,以及为什么单个按钮是错的
百分号编码把一个字符替换成%加上它的十六进制字节值。规范把字符分成三类,所有令人困惑的地方都源于此。非保留字符——字母、数字、连字符、句点、下划线和波浪号——永远不需要编码。保留字符——构成URL结构的斜杠、问号、&符号、等号和冒号——*作为数据时*必须编码,*作为结构时*则不能编码。其余所有字符一律编码。
这就是为什么不存在唯一正确的答案。编码整个URL时,必须保留斜杠和问号,否则地址就不再是地址。编码要放入查询参数的值时,必须转义&符号和等号,否则包含它们的值会被拆成两个参数。编码路径片段时,必须转义斜杠,否则带斜杠的文件名会变成两层目录。单个“编码”按钮只能选其中一种,另外三分之二的情况就会出错——通常悄无声息,而且通常只在输入不寻常时才暴露出来。
空格是背负历史最多的字符。在URL中它是%20。在提交的HTML表单中它是+,这是另一种更古老的编码,因为表单从1994年起就一直这样工作,所以沿用至今。两者在各自的场景中都正确,在对方的场景中都不正确,这就是为什么查询字符串中的加号存在歧义,而且无论编码时多么小心都无法消除。
非ASCII文本会先转换成UTF-8,再逐字节编码,所以一个带重音的字母会变成两段百分号序列,一个emoji会变成四段。重复编码是经典bug:对已经编码的内容再编码一次,会把每个%变成%25,于是%20变成%2520,接收方收到的是一个字面意义上的百分号。如果一个URL里满是%25,说明它多经过了一次编码器。
如果您需要的是别的
在代码中,请使用语言自带的函数,并像本页面要求您的那样慎重选择。JavaScript有用于完整地址的encodeURI和用于值的encodeURIComponent;Python的urllib.parse.quote有一个safe参数,默认保留斜杠不编码;PHP区分rawurlencode和urlencode,两者的差别恰恰就在上文所说的空格与加号问题上。更好的做法是用URL类型来构建URL,而不是拼接字符串,这样问题就不存在了。
在命令行中,jq -rR @uri能安全地编码,并且可以处理列表;curl --data-urlencode能构建编码正确的参数,无需您去考虑属于三种情况中的哪一种——这是唯一一处真正轻松的地方。
常见问题
三种编码该用哪一种?
几乎总是用“单个值”。当您编码的是“一个”即将放进查询字符串或路径片段的值时——搜索词、邮箱地址、跳转目标——就用它。三种中只有它会转义&、=、?和/,而这正是防止您的值跳出所在参数、变成两个参数的关键。只有当您手上已经是一个完整的URL,只想清理其中的不安全字符时,才用“完整URL”;它会有意保留结构字符,让URL仍然是URL。构建application/x-www-form-urlencoded请求体时用“表单数据”,其中空格是+而不是%20。
为什么我的“&”把URL弄坏了?
因为它没有被编码,而&正是查询字符串用来分隔参数的符号。把“Smith & Sons”这个值原样接在?company=后面,到达服务器时就变成了company=Smith,外加一个名为“Sons”的空参数。这是最常见的URL bug,而“单个值”编码就是解决办法——它把&变成%26,让值保持为一个值。
为什么我的“+”变成了空格?
因为在查询字符串中,+表示空格——这条规则继承自HTML表单,至今没有任何办法去掉。所以数据中字面意义上的加号,比如电话号码或Base64字符串里的加号,会被接收方服务器读成空格。“单个值”编码会把它转义为%2B,从而完好无损地送达。
能处理其他语言和emoji吗?
能。文本先转换成UTF-8,再逐字节进行百分号编码,这是RFC 3986的要求,也是所有现代服务器所期望的。日文、阿拉伯文、带重音的拉丁字母和emoji都能完全还原。
为什么这里会编码! ' ( ) *,而其他工具不会?
因为浏览器内置的encodeURIComponent不编码这五个字符,而RFC 3986把它们列为保留字符。有些服务器和框架会把它们当作结构字符处理,所以包含它们的值可能被误读。编码它们没有任何害处——在任何地方都能原样解码回来——还能消除一类罕见而难以排查的bug。严谨的实现都会这样做。
我的文本会被存储吗?
不会。不存储任何内容,也不发出任何请求。页面加载完成后,您甚至可以断开网络,它照样能用。
小贴士: 正确答案有三种,页面会让您自己选择,因为常见的单个“编码”按钮三次里有两次是错的。编码整个URL、查询参数和路径片段时,需要转义的字符各不相同;用错了会悄无声息地破坏斜杠、加号或&符号。
把这个工具放到您的网站上
博客、课程页面或帮助文章均可免费使用。粘贴一段代码,访客就能直接在您的页面上使用。