术语表
URL编码(URL Encoding)
URL编码也称为百分号编码(Percent-Encoding),是一种将字符转换为可在URL中安全传输的编码机制。其基本格式为百分号%后跟两位十六进制数字,表示该字符在字符集中的编码值。URL编码最早在RFC 1738(1994年)中定义,用于解决URL中非ASCII字符和保留字符的传输问题。目前广泛应用于Web表单数据提交、API查询参数编码、HTTP请求头字段编码等场景。URL编码是Web开发中最基础的字符编码知识之一,正确理解其原理和使用方式,是每一位Web开发者必备的技能。
百分号编码(Percent-Encoding)
百分号编码是URL编码的技术名称,因其编码格式以百分号%开头而得名。在百分号编码中,每个被编码的字符都表示为%HH的形式,其中HH是该字符ASCII码或字节值的两位十六进制大写表示。例如空格(ASCII 32)编码为%20,感叹号(ASCII 33)编码为%21。对于多字节字符(如中文),先将其转换为UTF-8字节序列,再对每个字节分别进行百分号编码。百分号编码的解码过程是其逆操作,将%HH格式还原为对应的字符。
保留字符(Reserved Characters)
保留字符是指在URL语法结构中有特殊含义的字符,根据RFC 3986标准定义。主要包括::(冒号)、/(斜杠)、?(问号)、#(井号)、[(左方括号)、](右方括号)、@(at符号)、!(感叹号)、$(美元符)、&(和号)、'(单引号)、((左括号)、)(右括号)、*(星号)、+(加号)、,(逗号)、;(分号)、=(等号)。当这些字符需要作为普通数据出现在URL中时,必须进行URL编码以避免与URL语法结构产生歧义。不同的编码函数对保留字符的处理策略有所不同,这是encodeURIComponent和encodeURI之间最核心的区别。
不安全字符(Unsafe Characters)
不安全字符是指在URL传输过程中可能引起歧义或被某些系统错误解析的字符。除了保留字符外,还包括空格(可能导致URL截断)、双引号(可能破坏HTML属性)、尖括号(可能被误解析为HTML标签)、反斜杠(在某些系统中有特殊含义)、脱字符(^)、花括号({})、竖线(|)、反引号等。这些字符在URL中使用时都必须进行编码。不安全字符的正确编码是防止URL注入攻击和XSS攻击的重要措施。
encodeURIComponent
encodeURIComponent是JavaScript内置的全局函数,用于对URL组件(如查询参数值)进行编码。它会编码除字母、数字、- _ . ! ~ * ' ( )以外的所有字符。注意,encodeURIComponent不编码的字符集合比encodeURI少得多,它会编码URL结构中常用的保留字符如/ : ? # [ ] @ & = + $ ,等。这意味着encodeURIComponent的编码结果是"最安全"的编码形式,适用于编码URL中的任何数据片段。在实际使用中,encodeURIComponent是最常用的URL编码函数,特别是编码查询参数值时,应始终使用此函数以避免参数值中的特殊字符破坏URL结构。
encodeURI
encodeURI是JavaScript内置的全局函数,用于对完整的URI(统一资源标识符)进行编码。与encodeURIComponent不同,encodeURI会保留URL的结构完整性,只编码对URL语法结构有特殊含义的保留字符以及不安全字符。encodeURI不编码的字符包括:A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #。这使得encodeURI适合编码整个URL字符串,而不仅仅是URL的某一部分。encodeURI的典型使用场景包括:对从用户输入构建的完整URL进行编码、编码需要在HTML属性中嵌入的URL等。
decodeURIComponent
decodeURIComponent是JavaScript内置的全局函数,是encodeURIComponent的逆操作函数。它将encodeURIComponent编码的字符串还原为原始字符串。decodeURIComponent会将%HH格式解码为对应的字符,包括将%20解码为空格、%2B解码为加号等。需要注意的是,如果输入字符串中包含无效的编码序列(如%后跟非十六进制字符),decodeURIComponent会抛出URIError异常。在解码前,建议先验证字符串是否为有效的编码格式。
decodeURI
decodeURI是JavaScript内置的全局函数,是encodeURI的逆操作函数。它将encodeURI编码的字符串还原为原始字符串。与decodeURIComponent不同,decodeURI不会解码URL结构中保留的编码字符(如%3A不被解码为:,%2F不被解码为/),因为这些字符在URL中有特殊含义,解码后可能导致URL结构被破坏。decodeURI适用于解码整个URL字符串,而decodeURIComponent适用于解码URL中的单个参数值。
application/x-www-form-urlencoded
application/x-www-form-urlencoded是HTML表单默认的编码格式,也是HTTP POST请求体最常用的编码格式之一。在这种格式中,表单数据被编码为键值对形式,键和值之间用等号=分隔,多个键值对用和号&分隔。与标准URL百分号编码不同的是,在此格式中空格字符被编码为加号+而不是%20,其他字符的编码方式与百分号编码一致。JavaScript的encodeURIComponent函数会将空格编码为%20,如果需要完全符合application/x-www-form-urlencoded格式,需要将%20替换为+。URL编码解码工具可以帮助开发者在这两种格式之间进行转换。
UTF-8编码
UTF-8是一种广泛使用的Unicode字符编码方案,使用1到4个字节表示一个Unicode字符。在URL编码中,中文字符首先被转换为UTF-8字节序列,然后每个字节再单独进行百分号编码。例如,"中"字的UTF-8编码为E4 B8 AD,URL编码后为%E4%B8%AD。UTF-8编码的引入使得URL能够表示世界上几乎所有语言的文字,极大地扩展了URL的表达能力。目前,UTF-8是URL编码中事实上的标准编码方式,几乎所有现代浏览器和服务器都默认使用UTF-8进行URL编解码。
URIError
URIError是JavaScript中的一个内置错误类型,当URI处理函数(如decodeURIComponent、decodeURI)遇到无效的编码序列时抛出此错误。常见的触发原因包括:百分号后跟非十六进制字符(如%ZZ)、不完整的编码序列(如%2)、编码序列超出有效范围等。在使用URL解码功能时,建议使用try-catch语句捕获URIError,以避免程序因解码失败而中断执行。工具内部已经处理了URIError的异常情况,当输入无效的编码字符串时会给出友好的错误提示。
UD5工具箱