什么是 URL
URL 就是用来定位资源的字符串。
怎么样的字符串是合法的 URL
满足如下条件的字符串都是合法的 URL:
字符串是一个合法的 URI ( Uniform Resource Identifier ) 字符串。其中,构成 URI 字符串的字符集合必须是 ASCII 码的子集。
字符串是一个合法的没有查询串的 IRI ( Internationalized Resource Identifier ) 字符串。 IRI 字符串是基于 Unicode 字符集的。
字符串是一个合法的 IRI 字符串,并且不能包含未被编码( escaped )的非 ASCII 查询字符串。
字符串所在文档的编码是 UTF-8 或者 UTF-16。
注: Unicode 是字符集,而 UTF-8 是一种以8位为一个编码单位的可变长编码方式,定义了具体字符和 Unicode 码之间的相互转换规则。
URL 中不能包含非 ASCII 字符,所以在实际场景中,会将 URL 中的非 ASCII 字符转换为 ASCII 字符,采用的规则是:将非 ASCII 字符按照一定的编码方式( 典型的就是 UTF-8 )转换为 Unicode 中的码位,然后用码位对应数值的16进制形式,加上%
号前缀,形成编码后的字符串,用这个字符串替换掉 URL 中对应的非 ASCII 字符串,就形成了合法的 URL 。
URL 的“合法化”
在浏览器环境中,主要存在如下需要“合法化” URL 的场景:
-
直接在地址栏输入 URL,此种场景又分为两部分来解析:
URL path 部分的解析。
URL 查询字符串部分的解析。
使用 encodeURI 对字符串中的非法字符进行编码( UTF-8 编码方式 )。
位于 HTML 文档内的字符串,比如 form 标签中的 action 属性、 a 标签中的 href 属性等等。
处理规则为:
无论何处的 URL 字符串, path 部分的编码都是按照 UTF-8 方式来执行的,所以此部分的非 ASCII 字符编码出来的样子是 UTF-8 转换后的 Unicode 码位值。
-
对于查询字符串部分,有两种情况:
地址栏中的查询字符串和调用 encodeURI 方法一样,都是直接采用 UTF-8 编码方式。
HTML 文档中 URL 的查询字符串部分,采用的编码方式与文档的编码方式一致,比如文档中有一句代码:
<a href="http://www.baidu.com/?q=中文">查询</a>
,如果文档编码是 UTF-8 ,那么转换出来的字符串为:http://www.baidu.com/?q=%E4%B8%AD%E6%96%87
;如果文档编码是 GBK ,那么转换出来的字符串为:http://www.baidu.com/?q=%D6%D0%CE%C4
。
注: 文档编码的确定方式,优先级由高到低的顺序为:
浏览器加载到的 HTML 文件采用了带 BOM 的 UTF-8 编码,那么浏览器可以根据这个编码来确定整个文档的编码。
在 HTML 文件对应的 HTTP 请求的响应头部里面指定了编码,比如
content-type: text/html; charset=UTF-8
,那么文档的编码就是此处指明的编码。在 HTML 代码里面使用 meta charset 指定编码,比如
<meta charset="UTF-8">
。此时要注意,一定要确保这个编码声明位于整个 HTML 文件的前1024 byte 之内,不然可能会造成浏览器无法正确读到编码值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。