浏览器地址栏 encode 算法
写一个类似浏览器的地址栏的东东,用户编辑一个 URI 进去,非单纯的 URL
正常情况下 URL 只需要对资源请求部分进行 URLEncode 一下就可以,代码上大致是咋样的过程呢?
如果用户输入的是一个 URI,有必要判断一下是否需要 URLEncode,而且 URLEncode 会将
:
/
?
等符号转义,所以肯定不能整体转换。而浏览器大多都做的很好,一下次就能转。
Answers
先判断整个URL是不是一个已经转义好的合法的URL。如果是的话直接用;如果不是的话,用/ & ? @ # = ; \ ,等字符把URL分隔开,然后将分隔的每个部分用URLEncode,再合并起来。可以用正则表达式比较容易的完成:
[^\/\&\?\@#\=\;,\\]* 替换成URLEncode($0)
关于分隔符,按照RFC3986,URI中的保留字为:
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
最为保险的方法是将所有这些字符都放进分隔符列表里,但实际上可能超过99%的URL中都只会出现:/?#&@=,这几个字符。对于字符+,如果不进行encode,用户在地址栏中输入http://www.baidu.com/这+那,由于服务器将+解析为空格的特性,地址就会编码成:http://www.baidu.com/这 那,因此是否强制编码+可以按照需求设计。另一个特殊字符是\,这个字符通常直接被替换成/。
chrome之类的浏览器似乎是对以上所有的字符都不进行编码的。