2012-07-21 17 views
8

Ho provato a capire da solo encode e decode in Python ma nulla è davvero chiaro per me.Non capisco codificare e decodificare in Python (2.7.3)

  1. str.encode([encoding,[errors]])
  2. str.decode([encoding,[errors]])

In primo luogo, non capisco la necessità del parametro "codifica" in queste due funzioni.

Qual è la produzione di ciascuna funzione, la sua codifica? Qual è l'uso del parametro "codifica" in ogni funzione? Non capisco davvero la definizione di "stringa di byte".

Ho una domanda importante, c'è qualche modo per passare da una codifica a un altro? Ho letto alcune testo su ASN.1 di "stringa di ottetto", così ho chiesto se era lo stesso di "byte string".

Grazie per il vostro aiuto.

+4

Ma avete letto i [documenti] (http://docs.python.org/library/stdtypes.html#str.encode), non è vero? Scusa se lo sto chiedendo – tiwo

risposta

19

È un po 'più complesso in Python 2 (rispetto a Python 3), poiché confonde i concetti di "stringa" e "test" piuttosto, ma vedi The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets. In sostanza, ciò che è necessario capire è che "stringa" e "carattere" sono concetti astratti che non possono essere rappresentati direttamente da un computer. Un bytestring è un flusso grezzo di byte direttamente dal disco (o che può essere scritto direttamente dal disco). encode passa da astratto a concreto (lo si preferisce una stringa unicode e restituisce una stringa di byte); decode va nella direzione opposta.

La codifica è la regola che dice che "a" deve essere rappresentato dal byte 0x61 e "α" dalla sequenza a due byte 0xc0\xb1.

+0

se capisco, una stringa non ha un vero senso dell'interprete, non può essere scambiata tra macchine così quando scrivo str.encoding ("ascii"), str diventa reale, è codificato secondo le ascii spécifications in quell'esempio in memoria e il suo valore di codifica lo identifica come definito da ascii e questa codifica è chiamata "stringa di byte": è giusta ?? –

+0

un byte in una "stringa di byte" può supportare un'aggiunta? –

+1

@NarcisseDoudieuSiewe per la prima domanda, sì, è giusto, anche se la terminologia è un po 'confusa - la "codifica" è ASCII, non il finale test - che potrebbe essere chiamato "una stringa ascii-codificata", per esempio. Per la seconda domanda, un elemento di un bytestring è una stringa di byte di un elemento (in Py2, un test è solo il tipo 'str', e una stringa è il tipo 'unicode'), quindi' b [0] + b [0] 'concatenazione. Questo è diverso in Py3, dove un elemento di un test è in realtà un 'int' e quindi 'b [0] + b [0]' aggiunge anche int. – lvc

4

Sì, una stringa di byte è una stringa di ottetto. La codifica e la decodifica avvengono quando si immette/esegue il testo (da/verso la console, i file, la rete, ...). La console può utilizzare UTF-8 internamente, il server web serve latin-1, e di alcuni formati di file hanno bisogno di codifiche strane come accenti di Bibtex: fran\c{c}aise. È necessario convertire da/a loro su input/output.

I {en|de}code metodi fanno questo. Vengono spesso chiamati dietro le quinte (ad esempio, print "hello world" codifica la stringa in base a qualsiasi cosa venga utilizzata dal terminale).

6

Python 2.x ha due tipi di stringhe:

  • str = "stringhe di byte" = una sequenza di ottetti. Sono utilizzati per codifiche di caratteri "legacy" (come windows-1252 o IBM437) e per dati binari non elaborati (come l'output struct.pack).
  • unicode = "stringhe Unicode" = una sequenza di UTF-16 o UTF-32 a seconda di come Python è costruito.

Questo modello era changed for Python 3.x:

  • 2.x unicode diventato 3.x str (e il prefisso u era caduto dalle letterali).
  • Un tipo bytes è stato introdotto per rappresentare dati binari.

A character encoding è un mapping tra stringhe Unicode e stringhe di byte. Per convertire una stringa Unicode, ad una stringa di byte, utilizzare il metodo encode:

>>> u'\u20AC'.encode('UTF-8') 
'\xe2\x82\xac' 

Per convertire l'altro modo, utilizzare il metodo decode:

>>> '\xE2\x82\xAC'.decode('UTF-8') 
u'\u20ac' 
14

mia presentazione da PyCon, Pragmatic Unicode, or, How Do I Stop The Pain copre tutti questi dettagli.

In breve, le stringhe Unicode sono sequenze di interi denominate punti di codice e le estensioni sono sequenze di byte. Una codifica è un modo per rappresentare punti di codice Unicode come una serie di byte. Quindi unicode_string.encode(enc) restituirà la stringa di byte della stringa Unicode codificata con "enc" e byte_string.decode(enc) restituirà la stringa Unicode creata decodificando la stringa di byte con "enc".

+0

Questo articolo è fantastico. Dovuto segnalarlo per leggerlo più volte. GRAZIE! –

Problemi correlati