2009-06-03 4 views

Antwort

6

OK, ich denke, ich werde mit einem Hybrid gehen benutzerdefinierten Funktionen eingestellt:

Encode. Verwenden encodeURIComponent(), dann in setzen schlitzt zurück
Dekodieren: Dekodiert alle gefundenen% Hex-Werte.

Hier ist eine vollständigere Variante dessen, was ich am Ende mit (es behandelt Unicode richtig, auch):

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 

Beachten Sie, wenn Sie nicht brauchen „sichere“ Zeichen bei der Kodierung ('/' standardmäßig in Python), dann können Sie einfach die integrierten Funktionen encodeURIComponent() und decodeURIComponent() direkt verwenden.

Auch wenn es Unicode-Zeichen (dh Zeichen mit Codepunkt> = 128) in der Zeichenfolge, dann encodeURIComponent() Kompatibilität mit JavaScripts zu halten, der Python quote_url() sein müsse:

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) 

Und unquote_url() würde be:

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

Wenn Sie Ihre eigene Frage zu beantworten, gehen, um Nehmen Sie sich die Zeit, eine ausführlichere Antwort zu geben, um anderen zu helfen, die auf die gleiche Frage stoßen. –

+0

@Chris: Hmm, tut mir leid. Ich werde meine Antwort erweitern und etwas Code hinzufügen. – Cameron

1

Versuchen Sie eine Regex. So etwas wie das:

mystring.replace(/[\xFF-\xFFFF]/g, "%" + "$&".charCodeAt(0)); 

Das wird jedes Zeichen über Ordnungszahl 255 mit seiner entsprechenden% HEX-Darstellung ersetzen.

+1

Das ist toll für Charaktere über 255, aber es gibt einige andere lustige Zitate() die unter 255 sind (wie '?', '&', '@' Und andere, die ich nicht kenne) – Cameron

+0

Die Klammern bezeichnen einen Zeichensatz, der sowohl einzelne Zeichen als auch Bereiche umfassen kann. Sie können es genauso einfach wie/[\? & @ \ XFF- \ xFFFF]/g schreiben, um dieses Ergebnis zu erzielen. Sie müssen nur allen Zeichen entkommen, die auch spezielle Zeichen (wie? Oder /) neu schreiben. – jiggy

1

Python: urllib.quote

Javascript: unescape

Ich habe nicht umfangreiche Tests gemacht, aber für meine Zwecke funktioniert es die meiste Zeit. Ich denke du hast ein paar spezielle Charaktere, die nicht funktionieren. Vielleicht, wenn ich etwas asiatischen Text oder etwas verwende, wird es brechen :)

Dies kam, wenn ich gegoogelt, also lege ich dies für alle anderen, wenn nicht speziell für die ursprüngliche Frage.

53

Für das Protokoll:

JavaScript    | Python 
----------------------------------- 
encodeURI(str)   | urllib.quote(str, safe='[email protected]#$&()*!+=:;,.?/\''); 
----------------------------------- 
encodeURIComponent(str) | urllib.quote(str, safe='~()*!.\'') 
+18

Für den noch mehr pendanten Datensatz verwendet "encodeURIComponent" UTF-8, während "urllib.quote (u'é ')" beispielsweise eine Ausnahme auslöst. Die äquivalente Python-Kodierung sollte 'urllib.quote (unicode (str) .encode ('utf-8'), safe = ...' – Cameron

+0

In Python3, urllib.parse.quote (s, safe = '...') sollte verwendet werden, die Codierung ist standardmäßig utf-8. Siehe https://docs.python.org/3.0/library/urllib.parse.html#urllib.parse.quote –

2

Die requests Bibliothek ein bisschen mehr populär ist, wenn Sie die zusätzliche Abhängigkeit nichts dagegen

from requests.utils import quote 
quote(str) 
Verwandte Themen