URI
URI(统一资源标识符)是一个用于标志某一互联网资源名称的字符串。
与 URL 和 URN 的关系
URL(统一资源定位符)和 URN(统一资源名称)属于 URI 的子集,URI 可以为 URL、URN 两者之一或同时是 URI 和 URN。URN 描述资源的名称,URL 描述资源的地址,而 URI 描述资源的 id。URI 可以是一个资源的 URL(地址)、或 URN(名称)。
例如,ISBN 0-486-27557-4
标志出了一个 ISBN 系统中的图书《罗密欧与朱丽叶》的某一特定版本。为获得该资源并阅读该书,需要它的位置,也就是一个 URL 地址,例如 file:///home/username/RomeoAndJuliet.pdf
,该 URL 标志出了存储于本地硬盘中的电子书文件。因此,URL 和 URN 有着互补的关系。
编码和解码
一般来说,URL 只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。这意味着,如果 URL 中有汉字,就必须编码后使用。
escape() 已废弃
将字符串(除了 ASCII 字符集(字母、数字、标点符号和 @*_+-./
))转义成十六进制形式(Unicode 编码值)并返回。当值小于等于 0xFF
时,用一个 2 位转义序列: %xx
表示。大于 0xFF
则使用 4 位序列:%uxxxx
表示。
1 | escape("abc123"); // "abc123" |
注意,escape() 不对
+
号编码,而网页在提交表单的时候,如果有空格,则会被转化为+
号。服务器处理数据的时候,也会把+
号处理成空格。所以,使用的时候要小心。
unescape() 已废弃
将十六进制形式字符串(除了 ASCII 字符集(字母、数字、标点符号和 @*_+-./
)的的十六进制形式)解码并返回。
1 | unescape('abc123'); // "abc123" |
encodeURI()
将字符串(除了 A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
)转义成 utf-8 形式,并且在每个字节前加上 %
。
1 | encodeURI("my test.asp?name=ståle&msg=你好"); // my%20test.asp?name=st%C3%A5le&msg=%E4%BD%A0%E5%A5%BD |
decodeURI()
解码 utf-8 形式的字符串(除了 A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
的十六进制形式)并返回。
1 | decodeURI('my%20test.asp?name=st%C3%A5le&msg=%E4%BD%A0%E5%A5%BD'); // my test.asp?name=ståle&msg=你好 |
encodeURIComponent()
将字符串(除了 A-Z a-z 0-9 - _ . ! ~ * ' ( )
)转义成 utf-8 形式,并且在每个字节前加上 %
。与 encodeURI() 的区别是,它用于对 URL 的组成部分进行个别编码,而不用于对整个 URL 进行编码。,比 encodeURI() 多转义了 ; , / ? : @ & = + $ #
11 种字符。
1 | encodeURIComponent("https://w3schools.com/my test.asp?name=ståle&msg=你好"); // https%3A%2F%2Fw3schools.com%2Fmy%20test.asp?name=st%C3%A5le&msg=%E4%BD%A0%E5%A5%BD |
注意,如果对 URL 路径前的字符进行转义,URL 将不能访问。
decodeURIComponent()
解码 utf-8 形式的字符串(除了 A-Z a-z 0-9 - _ . ! ~ * ' ( )
的十六进制形式)并返回。
1 | decodeURIComponent('https%3A%2F%2Fw3schools.com%2Fmy%20test.asp?name=st%C3%A5le&msg=%E4%BD%A0%E5%A5%BD'); // https://w3schools.com/my test.asp?name=ståle&msg=你好 |