Как сравнить строки в кодировке URI? - PullRequest
0 голосов
/ 09 ноября 2019

У меня взяли интервью для растущего стартапа. Один из вопросов касался кодировки URI.

W3.org говорит, что эти URI одинаковы. Я изменил ABC с B93. Я получил это

>>> url4 = "http://b93.com:80/~smith/home.html"
>>> url5 = "http://b93.com/%7Esmith/home.html"
>>> urllib.parse.quote(url4)
'http%3A//b93.com%3A80/~smith/home.html'
>>> urllib.parse.quote(url5)
'http%3A//b93.com/%257Esmith/home.html'

Как сравнить закодированные строки, чтобы получить правильную информацию? Как выполнить дальнейшее тестирование?

Я также пробовал JS с encodeURIComponenet ()

var p1 = encodeURIComponent("http://b93.com:80/~smith/home.html");
var p2 = encodeURIComponent("http://b93.com/%7Esmith/home.html");

console.log(p1);
console.log(p2);

Выход

http%3A%2F%2Fb93.com%3A80%2F~smith%2Fhome.html
http%3A%2F%2Fb93.com%2F%257Esmith%2Fhome.html

РЕДАКТИРОВАТЬ РЕШЕНО

deceze предположил, чтоЯ нормализую свой URL Node.Js код

var normalizeUrl = require('normalize-url');

var n1 = normalizeUrl("http://b93.com:80/~smith/home.html");
var n2 = normalizeUrl("http://b93.com/%7Esmith/home.html");

console.log(n1);
console.log(n2);

var p1 = encodeURIComponent(n1);
var p2 = encodeURIComponent(n2);

console.log(p1);
console.log(p2);

Работает нормально

http://b93.com/~smith/home.html
http://b93.com/~smith/home.html
http%3A%2F%2Fb93.com%2F~smith%2Fhome.html
http%3A%2F%2Fb93.com%2F~smith%2Fhome.html

1 Ответ

3 голосов
/ 09 ноября 2019

Один из способов сделать это - сначала убедиться, что вы будете сравнивать URL без кавычек (используя urllib.parse.unquote вместо urllib.parse.quote). Затем вы можете использовать urllib.parse.urlparse для извлечения основных частей URL-адреса и сравнения их.

from urllib.parse import unquote, urlparse
url4 = "http://b93.com:80/~smith/home.html"
url4 = unquote(url4)
url5 = "http://b93.com/%7Esmith/home.html"
url5 = unquote(url5)
u4 = urlparse(url4)
u5 = urlparse(url5)
if u4.scheme == u5.scheme and u4.hostname == u5.hostname and u4.path == u5.path:
    print('equal')
else:
    print('different')

Чтобы быть действительно уверенным, вы также можете сравнить порт, используя scheme для определенияпорт при port is None.

...