什么是 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 之内,不然可能会造成浏览器无法正确读到编码值。


yibuyisheng
480 声望3 粉丝

前端工程师


引用和评论

0 条评论