¿Existen funciones de Javascript equivalentes para urllib.quote()
y urllib.unquote()
?
Lo más cercano que he encontrado son escape()
, encodeURI()
y encodeURIComponent()
(y sus correspondientes funciones de no encoding), pero no codifican / decodifican el mismo conjunto de caracteres especiales por lo que puedo decir. .
Gracias,
Cameron
Para el registro:
JavaScript | Python ----------------------------------- encodeURI(str) | urllib.quote(str, safe='~@#$&()*!+=:;,.?/\''); ----------------------------------- encodeURIComponent(str) | urllib.quote(str, safe='~()*!.\'')
Bien, creo que voy a ir con un conjunto de funciones híbrido personalizado:
Codificar: use encodeURIComponent (), luego vuelva a colocar las barras inclinadas.
Decodificar: Decodifica cualquier% de valores hexadecimales encontrados.
Aquí hay una variante más completa de lo que terminé usando (también maneja Unicode correctamente):
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
Tenga en cuenta que si no necesita caracteres “seguros” al codificar ( '/'
de forma predeterminada en Python), puede usar directamente las funciones encodeURIComponent()
y decodeURIComponent()
incorporadas.
Además, si hay caracteres Unicode (es decir, caracteres con punto de código> = 128) en la cadena, para mantener la compatibilidad con encodeURIComponent()
JavaScript, Python quote_url()
tendría que ser:
def quote_url(url, safe): """URL-encodes a string (either str (ie 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)
Y unquote_url()
sería:
def unquote_url(url): """Decodes a URL that was encoded using quote_url. Returns a unicode instance. """ return urllib.unquote(url).decode('utf-8')
La biblioteca de solicitudes es un poco más popular si no te importa la dependencia adicional
from requests.utils import quote quote(str)
Intente una expresión regular. Algo como esto:
mystring.replace(/[\xFF-\xFFFF]/g, "%" + "$&".charCodeAt(0));
Eso reemplazará cualquier carácter por encima del ordinal 255 con su correspondiente representación% HEX.
Python: urllib.quote
Javascript: unescape
No he realizado pruebas exhaustivas, pero para mis propósitos funciona la mayor parte del tiempo. Supongo que tienes algunos personajes específicos que no funcionan. Tal vez si utilizo algún texto asiático o algo se romperá 🙂
Esto surgió cuando busqué en Google, así que lo puse para todos los demás, si no específicamente para la pregunta original.