是否有与Pythonurllib.quote()和等效的Javascript函数urllib.unquote()?
urllib.quote()
urllib.unquote()
我遇到的最接近的是escape(),encodeURI()和和encodeURIComponent()(及其对应的非编码函数),但据我所知,它们不会对同一组特殊字符进行编码/解码。
escape()
encodeURI()
encodeURIComponent()
谢谢, 卡梅伦
好的,我想我将使用一组混合的自定义函数:
编码:使用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()直接的功能。
'/'
decodeURIComponent()
另外,如果字符串中包含Unicode字符(即,代码点> = 128的字符),则为了保持与JavaScript的兼容性encodeURIComponent(),Pythonquote_url()必须为:
quote_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()将是:
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')