小编典典

Python的urllib.quote()和urllib.unquote()的等效Javascript函数

python

是否有与Pythonurllib.quote()和等效的Javascript函数urllib.unquote()

我遇到的最接近的是escape()encodeURI()和和encodeURIComponent()(及其对应的非编码函数),但据我所知,它们不会对同一组特殊字符进行编码/解码。

谢谢,
卡梅伦


阅读 204

收藏
2021-01-20

共1个答案

小编典典

好的,我想我将使用一组混合的自定义函数:

编码:使用encodeURIComponent(),然后放回斜杠。
解码:对找到的所有%hex值进行解码。

这是我最终使用的内容的更完整变体(它也可以正确处理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

请注意,如果在编码时(你并不需要“安全”的字符'/'默认的Python),那么你可以使用内置的encodeURIComponent()decodeURIComponent()直接的功能。

另外,如果字符串中包含Unicode字符(即,代码点> =
128的字符),则为了保持与JavaScript的兼容性encodeURIComponent(),Pythonquote_url()必须为:

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)

并且unquote_url()将是:

def unquote_url(url):
    """Decodes a URL that was encoded using quote_url.
    Returns a unicode instance.
    """
    return urllib.unquote(url).decode('utf-8')
2021-01-20