指南

URL编码:完整指南

URL编码(也称为百分号编码)对于在URL中传输数据至关重要。了解何时以及如何编码字符可以防止链接损坏、安全漏洞和数据传输错误。

为什么需要URL编码?

URL是为ASCII文本设计的,具有具有特殊含义的保留字符。?字符开始查询字符串,&分隔参数,=分配值,#标记片段。如果您的数据包含这些字符,它们必须被编码以避免误解。

想象搜索「Tom & Jerry」。如果没有编码,?q=Tom & Jerry会将&视为参数分隔符,从而破坏查询。正确编码:?q=Tom%20%26%20Jerry将整个字符串视为一个值。

非ASCII字符也必须编码。URL只能包含ASCII。国际字符如ü、漢、или必须成为百分号编码字节才能出现在URL中。

空格是常见的特殊情况。它们可以编码为%20或有时编码为+(但仅在查询字符串中)。这种不一致导致常见错误。使用%20以获得最可靠的兼容性。

安全影响很重要。URL中未编码的用户输入可能导致XSS漏洞、注入攻击和URL操纵。始终编码放置在URL中的用户生成内容。

URL编码如何工作

URL编码用百分号后跟两个十六进制数字替换不安全字符。空格(ASCII 32,十六进制20)变为%20。&字符(ASCII 38,十六进制26)变为%26。

对于UTF-8字符,过程是:将字符转换为UTF-8字节,然后对每个字节进行百分号编码。ü字符是UTF-8字节C3 BC,因此变为%C3%BC。中文中是UTF-8 E4 B8 AD,因此变为%E4%B8%AD。

不需要编码的安全字符是A-Z、a-z、0-9和这些:- _ . ~(尽管某些实现也会编码这些)。

当它们是字面意义时必须编码的保留字符包括:! # $ & ' ( ) * + , / : ; = ? @ [ ]。这些具有特殊的URL含义,因此字面使用需要编码。

双重编码是常见错误。编码已经编码的字符串使%20变为%2520。在重新编码之前解码或仔细跟踪编码状态。

JavaScript URL函数

JavaScript提供了几个具有不同行为的URL编码函数。选择错误的会破坏URL或暴露安全漏洞。

encodeURIComponent()通常是您想要的。它编码除A-Z a-z 0-9 - _ . ! ~ * ' ( )之外的所有内容。将其用于参数值:'?name=' + encodeURIComponent(userInput)。

encodeURI()编码完整URL并保留保留字符如: / ? &未编码。将其用于整个URL:encodeURI('https://example.com/path?q=test')。但它不会正确处理包含保留字符的参数值。

关键区别:encodeURI('a&b')返回'a&b'(&保持)。encodeURIComponent('a&b')返回'a%26b'(&被编码)。对于大多数用例,encodeURIComponent对于值是正确的。

对于解码,使用decodeURIComponent()用于单个值,使用decodeURI()用于完整URL。

传统函数escape()和unescape()已弃用,并且不能正确处理Unicode。永远不要在新代码中使用它们。

试用工具

URL编码/解码器

URL编码/解码器

了解更多

常见问题

URL编码/解码器

常见问题