Existují nějaké ekvivalentní funkce JavaScriptu pro Python urllib.parse.quote()
a urllib.parse.unquote()
?
Nejbližší, na co jsem narazil, jsou encodeURI()
/encodeURIComponent()
a escape()
(a jejich odpovídající nekódovací funkce), ale pokud vím, nekódují/dekódují stejnou sadu speciálních znaků.
Odpověď
Dobře, myslím, že použiji hybridní vlastní sadu funkcí:
Kódování:Použijte encodeURIComponent() a poté vložte zpět lomítka.
Decode:Dekóduje všechny nalezené %hex hodnoty.
Zde je úplnější varianta toho, co jsem nakonec použil (také správně zpracovává Unicode):
function quoteUrl(url, safe) { if (typeof(safe) !== 'string') { safe = '/'; // Don't escape slashes by default } url = encodeURIComponent(url); // Unescape characters that were in the safe list toUnencode = [ ]; for (var i = safe.length - 1; i >= 0; --i) { var encoded = encodeURIComponent(safe[i]); if (encoded !== safe.charAt(i)) { // Ignore safe char if it wasn't escaped toUnencode.push(encoded); } } url = url.replace(new RegExp(toUnencode.join('|'), 'ig'), decodeURIComponent); return url; } var unquoteUrl = decodeURIComponent; // Make alias to have symmetric function names
Pamatujte, že pokud při kódování nepotřebujete „bezpečné“ znaky ('/'
ve výchozím nastavení v Pythonu), pak stačí použít vestavěný encodeURIComponent()
a decodeURIComponent()
funguje přímo.
Také pokud jsou v řetězci znaky Unicode (tj. znaky s kódovým bodem>=128), pak pro zachování kompatibility s encodeURIComponent()
JavaScriptu , Python quote_url()
by muselo být:
def quote_url(url, safe): """URL-encodes a string (either str (i.e. ASCII) or unicode); uses de-facto UTF-8 encoding to handle Unicode codepoints in given string. """ return urllib.quote(unicode(url).encode('utf-8'), safe)
A unquote_url()
by bylo:
def unquote_url(url): """Decodes a URL that was encoded using quote_url. Returns a unicode instance. """ return urllib.unquote(url).decode('utf-8')