百分号编码

百分号编码（英语：Percent-encoding，又称：URL编码（英语：URL encoding）），是特定上下文的统一资源定位符 (URL)的编码机制. 实际上也适用于统一资源标志符（URI）的编码。也用于为application/x-www-form-urlencodedMIME准备数据，因为它用于通过HTTP的请求操作（request）提交HTML表单数据。

百分号编码未保留字符

未保留字符不需要百分号编码.
两个URI的差别如果仅在于未保留字符是用百分号编码还是用字符自身表示，那么这两个URI具有等价的语义. 但URI处理器实际上并不总是把二者视作等价. 例如, URI的消费者不应该把"%41"与"A", "%7E"与"~"视作不同, 但是某些URI的消费者就是这么做了. 为了最大的互操作性, URI的制造者不应该对未保留字符进行百分号编码。

对百分号字符的百分号编码

由于百分号字符("%")表示百分号编码字节流的存在, 因此百分号字符应该被编码为3个字节的序列："%25"，用于URI内部。

任意数据的百分号编码

大多数URI涉及表示任意数据, 例如IP地址或文件系统路径作为URI的成分。

二进数据

1994年发布的RFC 1738规定， URI中的二进制数据应该表示为8位元组的序列，然后对每个8位元组按照上述方式百分号编码. 例如，字节值0F (十六进制)应表示为"%0F", 字节值41(十六进制)应表示为"A"或"%41". 优先使用未保留字符来表示这些字节值，因为这使得URL更短.

字符数据

二进数据的百分号编码过程已经被外推到字符数据，甚至到不适合或未被完全规范的地步. 在WWW初创阶段，仅仅处理ASCII字符是否编码问题，还没有什么问题。但随后发展到对非ASCII字符如何在URI中编码，缺少标准规范的情况下导致了歧义性的解释URI的错误。
例如， 基于RFC 1738与2396的协议规定，字符数据先要根据某种字符编码转换为字节流，然后再表示为URI。如果URI不提供是何种字符编码的提示信息，那么这个URI难以可靠的解析。

当前标准

2005年1月发布的RFC 3986，建议所有新的URI必须对未保留字符不加以百分号编码；其它字符建议先转换为UTF-8字节序列, 然后对其字节值使用百分号编码。此前的URI不受此标准的影响。

非标准的实现

有一些不符合标准的把Unicode字符在URI中表示为: %uxxxx, 其中xxxx是用4个十六进制数字表示的Unicode的码位值。任何RFC都没有这样的字符表示方法，并且已经被W3C拒绝。第三版的ECMA-262仍然包含函数escape(string)使用这种语法, 但也有函数encodeURI(uri)转换字符到UTF-8字节序列并用百分号编码每个字节。

application/x-www-form-urlencoded类型

当HTML表单中的数据被提交时，表单的域名与值被编码并通过HTTP的GET或者POST方法甚至更古远的email把请求发送给服务器。这里的编码方法采用了一个非常早期的通用的URI百分号编码方法，并且有很多小的修改如新行规范化以及把空格符的编码"%20"替换为"+" . 按这套方法编码的数据的MIME类型是application/x-www-form-urlencoded, 当前仍用于（虽然非常过时了）HTML与XForms规范中. 此外，CGI规范包括了web服务器如何解码这类数据、利用这类数据的内容。
如果发送的是HTTP GET请求, application/x-www-form-urlencoded数据包含在所请求URI的查询成分中. 如果发送的是HTTP POST请求或通过email, 数据被放置在消息体中，媒体类型的名字被包含在消息的Content-Type头内部。