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编码/解码器
常见问题 →