2009-06-03 14 views

Odpowiedz

6

OK, myślę, że mam zamiar iść z hybrydowym niestandardowy zestaw funkcji:

Koduje. Zastosowanie encodeURIComponent(), a następnie umieścić z powrotem w ukośniki
Dekodowanie: dekoduj wszystkie znalezione wartości% szesnastkowe.

Oto bardziej kompletny wariant co skończyło się stosując (obsługuje Unicode poprawnie, zbyt):

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 

Należy pamiętać, że jeśli nie trzeba „bezpieczne” znaków podczas kodowania ('/' domyślnie Python), można wtedy bezpośrednio korzystać z wbudowanych funkcji encodeURIComponent() i decodeURIComponent().

Ponadto, jeśli istnieją znaki Unicode (czyli postacie z kodowy> = 128) w łańcuchu, a następnie w celu utrzymania kompatybilności z JavaScript na encodeURIComponent(), Python quote_url() musiałyby być:

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) 

And unquote_url() byłoby być:

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

Jeśli masz zamiar odpowiedzieć na własne pytanie, na przynajmniej poświęć czas, aby wspólnie udzielić bardziej szczegółowej odpowiedzi, aby pomóc innym, którzy natkną się na to samo pytanie. –

+0

@ Chris: Hmm, przepraszam za to. Rozwinąłem odpowiedź i dodałem kod. – Cameron

1

Spróbuj wyrażeń regularnych. Coś takiego:

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

To zastąpi dowolny znak powyżej 255 w porządku z odpowiadającym mu% reprezentacją HEX.

+1

To jest świetne dla postaci powyżej 255, ale są też inne zabawne, które cytują() połowy poniżej 255 (jak '?', '&', '@' I inne, o których nie wiem) – Cameron

+0

Nawiasy oznacza zestaw znaków, który może zawierać pojedyncze znaki, a także zakresy. Możesz równie dobrze napisać jako/[\? & @ \ XFF- \ xFFFF]/g, aby osiągnąć ten wynik. Musisz tylko uciec z dowolnych znaków, które również wyodrębniają specjalne znaki (jak? Lub /). – jiggy

1

Python: urllib.quote

Javascript: unescape

nie robiłem obszerne badania, ale do moich celów to działa większość czasu. Domyślam się, że masz jakieś specyficzne postacie, które nie działają. Może gdybym użył jakiegoś azjatyckiego tekstu lub czegoś, co by się zepsuło :)

To pojawiło się, gdy googlowałem, więc wstawiłem to dla wszystkich pozostałych, jeśli nie specjalnie dla pierwotnego pytania.

53

Dla przypomnienia:

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

Dla jeszcze bardziej pendantycznego zapisu, 'encodeURIComponent' używa UTF-8, podczas gdy' urllib.quote (u'é ') ', na przykład, zgłasza wyjątek. Odpowiednim kodowaniem w języku Python powinno być 'urllib.quote (unicode (str) .encode ('utf-8'), safe = ...' – Cameron

+0

W języku Python3, urllib.parse.quote (s, safe = '...') powinno być użyte, kodowanie jest domyślnie utf-8. Patrz https://docs.python.org/3.0/library/urllib.parse.html#urllib.parse.quote –

2

Biblioteka requests jest nieco bardziej popularne, jeśli nie masz nic przeciwko dodatkową zależność

from requests.utils import quote 
quote(str) 
Powiązane problemy