Ekvivalentní funkce JavaScriptu pro Pythonovy urllib.parse.quote() a urllib.parse.unquote()

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')