2010-07-20 6 views
9

Ho voluto url codificare una stringa python e ottenere delle eccezioni con le stringhe ebraiche. Non ho potuto aggiustarlo e ho iniziato a fare una programmazione orientata all'ipotesi. Infine, facendo mystr = mystr.encode("utf8") prima di inviarlo al codificatore url salvato il giorno.Python: cosa risolve la correzione "...". Encode ("utf8")?

Qualcuno può spiegare cosa è successo? Cosa fa .encode ("utf8")? La mia stringa originale era comunque una stringa unicode (cioè prefissata da u).

+9

Non è un anwer diretto, ma questo testo merita una lettura: [Il minimo assoluto Ogni sviluppatore di software assolutamente, positivamente deve sapere su Unicode e set di caratteri (nessuna scusa!)] (Http: //www.joelonsoftware. it/articles/Unicode.html) di Joel Spolsky – balpha

+8

Programmazione orientata all'errore. Ora questo è un paradigma popolare :) – Amnon

+0

nella mia esperienza conoscere le basi (come si sta facendo qui) è più efficace. – Amnon

risposta

9

La stringa originale era un oggetto unicode contenente i punti codice Unicode non elaborati, dopo la codifica come UTF-8 è una normale stringa di byte che contiene i dati codificati UTF-8.

L'encoder dell'URL sembra aspettarsi una stringa di byte, in modo che possa codificare l'URL un byte dopo l'altro e non debba occuparsi dei punti di codice Unicode. Quando gli si assegna un oggetto unicode, tenta di convertirlo in una stringa di byte usando una codifica predefinita, probabilmente ASCII. Per i caratteri ebraici che non possono essere rappresentati come ASCII, ciò porterà ad errori.

1

"...". Encode ("utf-8") trasforma la rappresentazione in memoria della stringa in una stringa con codifica UTF-8.

l'encoder dell'URL probabilmente si aspetta un bytestring, ovvero una rappresentazione di stringa in cui ogni carattere è rappresentato con un singolo byte.

0

Restituisce una versione codificata UTF-8 della stringa Unicode, mystr. È importante rendersi conto che UTF-8 è semplicemente un modo per codificare Unicode. Python può funzionare con molte altre codifiche (ad esempio mystr.encode ("utf32") o anche mystr.encode ("ascii")).

0

Il numero link che balpha ha pubblicato spiega tutto. In breve:

Il fatto che la stringa fosse preceduta da "u" significa semplicemente che è composto da caratteri Unicode (o punti di codice). UTF-8 è una codifica di questa stringa in una sequenza di byte.

13

mia stringa originale era una stringa unicode comunque (cioè preceduti da un u)

... che è il problema. Non era una "stringa", in quanto tale, ma un "oggetto Unicode". Contiene una sequenza di punti di codice Unicode. Questi punti di codice devono, ovviamente, avere una rappresentazione interna di cui Python è a conoscenza, ma qualunque cosa sia viene sottratta e vengono mostrate come entità \uXXXX quando si utilizza print repr(my_u_str).

Per ottenere una sequenza di byte che un altro programma può comprendere, è necessario prendere quella sequenza di punti di codice Unicode e codificarla. Devi decidere sulla codifica, perché ce ne sono molte tra cui scegliere. UTF8 e UTF16 sono scelte comuni. Anche l'ASCII potrebbe esserlo, se si adatta. u"abc".encode('ascii') funziona bene.

fare my_u_str = u"\u2119ython" e poi type(my_u_str) e type(my_u_str.encode('utf8')) per vedere la differenza nei tipi: il primo è <type 'unicode'> e il secondo è <type 'str'>. (Sotto Python 2.5 e 2.6, comunque).

Le cose sono diverse in Python 3, ma dal momento che lo uso raramente starei parlando del mio cappello se provassi a dire qualcosa di autorevole.

+0

+1 Ottima spiegazione. –

+0

[Questo] (https://tools.ietf.org/html/rfc3986) sembra implicare utf-8 per qualcosa che non sia già ASCII, in più se è da w3schools sappiamo che non ha autorità. w3fools.com – stommepoes

4

Cosa fa .encode ("utf8")?

Dipende da quale versione di Python che si sta utilizzando:

  • In Python 3.x, converte un oggetto str (codificato in UTF-16 o UTF-32) in un oggetto bytes contenente la rappresentazione UTF-8 della stringa.
  • In Python 2.x, converte un oggetto unicode in un oggetto str codificato in UTF-8. Ma lo str ha anche il metodo encode e scrivere '...'.encode('UTF-8') equivale a scrivere '...'.decode('ascii').encode('UTF-8').

Poiché hai menzionato il prefisso "u", devi utilizzare 2.x. Se non hai bisogno di librerie 2.x-only, ti consiglio di passare a 3.x, che ha una chiara distinzione tra testo e dati binari.

Dive into Python 3 ha una buona spiegazione del problema.

Qualcuno può spiegare cosa è successo?

Sarebbe di grande aiuto se ci dicesse qual era il messaggio di errore.

La funzione urllib.quote si aspetta un oggetto str. Capita anche di lavorare con gli oggetti unicode che contengono solo caratteri ASCII, ma non quando contengono lettere ebraiche.

In Python 3.x, urllib.parse.quote accetta entrambi str (= Python 2.x unicode) e bytes oggetti. Le stringhe sono automaticamente codificate in UTF-8.