2012-12-08 6 views
5

In Javascript ich Folgendes tun:Python-URL-Dekodierung?

encodeURIComponent(comments) 

während in Python i wie folgt vor:

urllib2.unquote(comments) 

Aus irgendeinem Grund, wenn ich wie folgt vorgehen:

encodedURIComponents('ø') 

ich %C3%B8, aber wenn ich entziffere

urllib2.unquote('%C3%B8') 

Ich bekomme ø statt ø, die das ursprüngliche Zeichen ist.

Was gibt?

Ich bin auf einer Plattform, die jQuery auf Client-Seite und Python/Django Server-Seite verwendet.

+0

Der Grund, warum Sie dies zu sehen sind, ist, dass eine Seite mit UTF-8, die anderen Latin-1 verwendet. Deshalb sollten Sie niemals die Standardcodierungen verwenden und die Daumen drücken. Wenn Sie Nicht-ASCII-Zeichen haben, behalten Sie sie intern in "Unicode" -Strings und kodieren und decodieren Sie Strings an jeder Grenze entsprechend. (Python 3 macht dies einfacher, indem es Ihnen einen Fehler anstelle von mojibake gibt, wenn Sie es falsch verstehen.) – abarnert

+0

Das Formular auf Client-Seite eingibt, nehme ich UTF-8, während Python/Django Unicode verwendet? Ich bin auf Python 2.x. – user1886965

+0

Webformulare können den Zeichensatz in jeder Richtung (in den HTTP-Headern oder im Antworthauptteil) angeben und standardmäßig auf Latin-1 setzen. Python 2 hat eine Möglichkeit, zwischen "str" ​​und "unicode" zu codieren und zu dekodieren, und wenn Sie nur "str" ​​verwenden, handelt es sich um Bytes, deren Bedeutung nicht spezifiziert ist. (Sehen Sie nach, was 'sys.getdefaultencoding()' zurückgibt.) Holen Sie sich also den Zeichensatz, den das Formular verwendet, und dekodieren Sie den String in Unicode, um damit zu arbeiten; Beim Zurücksenden kodieren Sie UTF-8 und setzen Sie den Zeichensatz (oder, besser gesagt, Django kümmert sich darum, falls der Browser aus irgendeinem Grund einen 'Accept-Charset' sendet). – abarnert

Antwort

7

einfach versuchen, es zu entschlüsseln:

urllib2.unquote('%C3%B8').decode('utf-8') # --> 'ø' 
+1

hinweis: es ist tatsächlich ['urllib.unquote()'] (http://docs.python.org/2/library/urllib#urllib.unquote) – jfs

+0

Wenn ich das tue, bekomme ich 'u '\ xf8' '...? – user1886965

+0

@ user1886965: 'u '\ xf8'' ist die exakt gleiche Zeichenkette wie' u'ø'', weil' ø' das 248ste Unicode-Zeichen ist. – abarnert