Domanda

Non sono mai stato sicuro di comprendere la differenza tra decodifica / codifica str / unicode.

So che str().decode() è per quando hai una stringa di byte che sai che ha una certa codifica dei caratteri, dato che quel nome di codifica restituirà una stringa unicode.

So che unicode().encode() converte i caratteri unicode in una stringa di byte in base a un determinato nome di codifica.

Ma non capisco a cosa servono str().encode() e unicode().decode(). Qualcuno può spiegare, e forse anche correggere qualcos'altro che ho sbagliato sopra?

EDIT:

Diverse risposte forniscono informazioni su cosa .encode fa su una stringa, ma nessuno sembra sapere cosa .decode fa per unicode.

È stato utile?

Soluzione

Il metodo decode delle stringhe unicode in realtà non ha alcuna applicazione (a meno che tu non abbia alcuni dati non testuali in una stringa unicode per qualche motivo - vedi sotto). È principalmente lì per motivi storici, penso. In Python 3 è completamente sparito.

unicode().decode() eseguirà una codifica implicita di s utilizzando il codec predefinito (ascii). Verifica in questo modo:

>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

>>> s.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

I messaggi di errore sono esattamente gli stessi.

Per str().encode() è il contrario - tenta una decodifica implicita di byte con la codifica predefinita:

>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)

Usato in questo modo, string è anche superfluo.

Ma c'è un'altra applicazione di quest'ultimo metodo che è utile: ci sono codifiche che non hanno nulla a che fare con i set di caratteri, e quindi possono essere applicati in modo significativo alle stringhe a 8 bit:

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

Hai ragione, però: l'uso ambiguo di " codifica " per entrambe queste applicazioni è ... imbarazzante. Ancora una volta, con i tipi <=> e <=> separati in Python 3, questo non è più un problema.

Altri suggerimenti

Per rappresentare una stringa unicode come una stringa di byte è noto come codifica . Usa u'...'.encode(encoding).

Esempio:

    >>> u'æøå'.encode('utf8')
    '\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8\xc3\x83\xc2\xa5'
    >>> u'æøå'.encode('latin1')
    '\xc3\xa6\xc3\xb8\xc3\xa5'
    >>> u'æøå'.encode('ascii')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: 
    ordinal not in range(128)

In genere si codifica una stringa unicode ogni volta che è necessario utilizzarla per IO, ad esempio trasferirla sulla rete o salvarla su un file su disco.

Per convertire una stringa di byte in una stringa unicode è noto come decodifica . Usa la decodifica unicode('...', encoding) o '...'. (Codifica).

Esempio:

   >>> u'æøå'
   u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so
   >>> unicode('\xc3\xa6\xc3\xb8\xc3\xa5', 'latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'
   >>> '\xc3\xa6\xc3\xb8\xc3\xa5'.decode('latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'

In genere decodifica una stringa di byte ogni volta che ricevi i dati della stringa dalla rete o da un file su disco.

Credo che ci siano alcune modifiche nella gestione degli Unicode in Python 3, quindi quanto sopra probabilmente non è corretto per Python 3.

Alcuni buoni collegamenti:

anUnicode. codifica ('codifica') genera un oggetto stringa e può essere chiamato su un oggetto unicode

aString. decodifica ('codifica') genera un oggetto unicode e può essere chiamato su una stringa, codificato in una data codifica.


Altre spiegazioni:

Puoi creare un oggetto Unicode, che non ha alcun set di codifica. Il modo in cui è memorizzato da Python in memoria non è un problema. Puoi cercarlo, dividerlo e chiamare qualsiasi funzione di manipolazione delle stringhe che ti piace.

Ma arriva un momento in cui desideri stampare l'oggetto unicode sulla console o in un file di testo. Quindi devi codificarlo (ad esempio - in UTF-8), chiami encode ('utf-8') e ottieni una stringa con '\ u & Lt; someNumber gt;' all'interno, che è perfettamente stampabile.

Quindi, ancora una volta - ti piacerebbe fare il contrario - leggi la stringa codificata in UTF-8 e la tratti come un Unicode, quindi \ u360 sarebbe un carattere, non 5. Quindi decodifichi una stringa (con la codifica selezionata) e ottieni un oggetto nuovissimo del tipo unicode.

Proprio come una nota a margine: puoi selezionare alcune codifiche pervertite, come 'zip', 'base64', 'rot' e alcune di esse convertiranno da stringa a stringa, ma credo che il caso più comune sia quello che coinvolge UTF-8 / UTF-16 e stringa.

mybytestring.encode (somecodec) è significativo per questi valori di somecodec:

  • base64
  • bz2
  • zlib
  • hex
  • quopri
  • rot13
  • string_escape
  • uu

Non sono sicuro di cosa sia utile decodificare un testo Unicode già decodificato. Provarlo con qualsiasi codifica sembra provare sempre a codificare prima con la codifica predefinita del sistema.

Dovresti leggere Python UnicodeDecodeError - Am I incomprendo codifica . La mia comprensione dell'unicode in Python è stata molto più chiara dopo aver letto la risposta accettata.

Ci sono alcune codifiche che possono essere usate per de- / codificare da str a str o da unicode a unicode. Ad esempio base64, hex o persino rot13. Sono elencati nel modulo di codec .

Modifica:

Il messaggio di decodifica su una stringa unicode può annullare l'operazione di codifica corrispondente:

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

Il tipo restituito è str invece di unicode che è sfortunato a mio avviso. Ma quando non stai eseguendo una corretta en / decodifica tra str e unicode, questo sembra comunque un casino.

La semplice risposta è che sono esattamente l'opposto dell'altro.

il computer utilizza l'unità base di byte per archiviare ed elaborare le informazioni, è insignificante per gli occhi umani.

ad esempio, '\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87' è la rappresentazione di due caratteri cinesi, ma il computer sa solo (che significa stampa o archivio) che sono caratteri cinesi quando viene loro assegnato un dizionario per cercare quella parola cinese, in questo caso, è " utf-8 " dizionario, e non riuscirebbe a mostrare correttamente la parola cinese desiderata se si guarda in un dizionario diverso o sbagliato (usando un metodo di decodifica diverso).

Nel caso precedente, il processo di ricerca di una parola cinese da parte di un computer è la decodifica ().

E il processo di scrittura del cinese nella memoria del computer è encode ().

quindi le informazioni di codifica sono i byte grezzi e le informazioni decodificate sono i byte grezzi e il nome del dizionario a cui fare riferimento (ma non il dizionario stesso).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top