未编码的URL和编码后的URL作比较
我们在开发的过程中,有时候会遇到需要比较URL地址的需求。要命的是我们并不知道需要比较的url是编码过的
https%3A%2F%2Fwww.baidu.com%2F
还是未编码的https://www.baidu.com/
。那么该如何处理才能保证比较的准确性呢?
思路1:编码后比较
encodeURIComponent()
方法对字符串进行编码
假设要比较的url是未编码的,我们把目标URL和跟他作比较的URL全部编码处理,保证两个url都是编码后的,这样就可以直接比较字符串啦!
有小伙伴会担心如果url本来就是编码过的又对他进行编码会不会不妥?这就需要先确定要比较的字符串是否编码。一般场景是前端判断后端返回的url是否跟目标url一样,后端返回的url是否编码可以事先确认,以保证得到的url总是未编码的或者总是已经编码的。
let str = 'https://www.baidu.com/';
let str1 = 'https%3A%2F%2Fwww.baidu.com%2F';
console.log(encodeURIComponent(str) == str1) //true
console.log(encodeURIComponent(str))
// https%3A%2F%2Fwww.baidu.com%2F
console.log(encodeURIComponent(str1))
// https%253A%252F%252Fwww.baidu.com%252F
//这里可以看出encodeURIComponent方法对 https%3A%2F%2Fwww.baidu.com%2F 中的 ‘%’再次编码了
这里可以看出encodeURIComponent方法对
https%3A%2F%2Fwww.baidu.com%2F
中的 ‘%’再次编码了
思路2:解码后比较
decodeURIComponent()
方法对字符串进行解码
假如要比较的URL是编码过的,那么可以先把url解码,再跟目标url进行字符串比较
例如把
https%3A%2F%2Fwww.baidu.com%2F
解码成https://www.baidu.com/
后再进行比较
let str = 'https://www.baidu.com/';
let str1 = 'https%3A%2F%2Fwww.baidu.com%2F';
console.log(decodeURIComponent(str1) == str) //true
console.log(decodeURIComponent(str1))
// https://www.baidu.com/
console.log(decodeURIComponent(str))
// https://www.baidu.com/
// 对已经解码的字符串再次decodeURIComponent解码不会改变字符串
综上所述,在处理URL比较的场景下,有两种方案可选,前提是知道需要比较的URL是编码过的还是未编码过的。
由思路1可知,对于已经编码过的url再次编码会改变url,可能会与我们的预期不符;
由思路2可知,对于未编码的url再次解码,得到的结果与未编码的url一致;
那么我们在对URL进行比较的时候,最保险的方式应该是总是对URLdecodeURIComponent
解码。这样无论该URL是否编码,我们对他进行解码总是能得到一样的结果,这样就保证了URL字符串的准确性。
总结:应该总是把需要比较的URL进行decodeURIComponent
解码,然后用解码后的字符串进行比较。
-完-