Frage

Ich habe nie sicher gewesen, dass ich den Unterschied zwischen str / Unicode-Decodierung und -Codierung verstehen.

Ich weiß, dass str().decode() für ist, wenn Sie eine Reihe von Bytes, die Sie kennen eine bestimmte Zeichencodierung haben, da dieser Namen kodiert wird es einen Unicode-String zurück.

Ich weiß, dass unicode().encode() Unicode-Zeichen in eine Folge von Bytes umwandelt gemäß einem bestimmten Codierung Namen.

Aber ich verstehe nicht, was str().encode() und unicode().decode() sind. Kann mir jemand erklären, und möglicherweise auch richtig alles, was ich habe falsch oben bekommen?

EDIT:

Mehrere Antworten geben Informationen über was .encode tut an einer Schnur, aber niemand scheint zu wissen, was .decode für Unicode der Fall ist.

War es hilfreich?

Lösung

Die decode Methode von Unicode-Strings wirklich hat keine Anwendungen auf alle (es sei denn, Sie haben einige Nicht-Textdaten in einem Unicode-String aus irgendeinem Grunde - siehe unten). Es ist vor allem dort aus historischen Gründen, denke ich. In Python 3 ist vollständig verschwunden.

unicode().decode() wird eine implizite Codierung von s mit dem Standard (ascii) Codec auszuführen. Stellen Sie sicher, das etwa so:

>>> 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)

Die Fehlermeldungen sind genau die gleichen.

Für str().encode() ist es umgekehrt - ein implizites versucht Decodierung von s mit der Standard-Codierung:

>>> 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)

wie folgt verwendet, str().encode() ist auch überflüssig.

Aber gibt es eine weitere Anwendung der letzteren Methode, die nützlich ist: es gibt Kodierungen , die nichts mit Zeichensätzen zu tun haben, und damit angewendet werden können 8-Bit-Zeichenketten in einer sinnvollen Art und Weise:

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

Sie haben Recht, aber: die mehrdeutige Verwendung von „Codierung“ für diese beiden Anwendungen ist ... awkard. Wieder mit separaten byte und string Typen in Python 3 ist dies kein Thema mehr.

Andere Tipps

eine Unicode-Zeichenfolge darzustellen, wie eine Kette von Bytes, die als bekannt ist Codierung . Verwenden Sie u'...'.encode(encoding).

Beispiel:

    >>> 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)

Sie kodieren typischerweise einen Unicode-String, wenn Sie es für IO verwenden müssen, zum Beispiel über das Netzwerk übertragen werden, oder es in eine Datei speichern.

Um eine Zeichenfolge von Bytes in einer Unicode-Zeichenkette konvertiert ist bekannt als Dekodierungs . Verwenden Sie unicode('...', encoding) oder '...'. Dekodieren (Codierung).

Beispiel:

   >>> 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'

Sie dekodieren die Regel eine Folge von Bytes, wenn Sie String-Daten aus dem Netzwerk oder von einer Festplattendatei.

erhalten

Ich glaube, es gibt einige Änderungen in Unicode-Behandlung in Python 3, so dass die oben ist wahrscheinlich nicht richtig für Python 3.

Einige gute Verbindungen:

anUnicode. kodieren ( 'encoding') zu einem string Objekt und kann auf einem Unicode-Objekt aufgerufen werden

aString. decode ( 'encoding') zu einer Unicode Objekt und kann auf eine Zeichenkette, codiert in gegebenen Codierung genannt werden.


Einige weitere Erklärungen:

Sie können einige Unicode-Objekt erstellen, die keine Codierung Satz hat. Die Art und Weise sie von Python im Speicher gespeichert sind, ist keiner Ihrer Sorge. Sie können es finden, teilen Sie es und rufen Sie eine beliebige Zeichenfolge Manipulation Funktion, die Sie mögen.

Aber es kommt eine Zeit, wenn Sie möchten, dass Ihr Unicode-Objekt drucken einige Textdatei zu trösten oder zu. So haben Sie auf kodieren es (zum Beispiel - in UTF-8), rufen Sie kodieren ( 'utf-8') und Sie erhalten eine Zeichenfolge mit '\ u ' innen, das ist perfekt bedruckbar.

Dann wieder - Sie möchten, dass das Gegenteil tun - lesen Sie in UTF-8 kodierten String und behandeln es als Unicode, so dass die \ U360 ein Zeichen wäre, nicht 5. Dann Sie dekodieren eine Zeichenkette (mit ausgewählter Codierung) und brandneue Aufgabe des Unicode-Typs erhalten.

Nur als Randnotiz - Sie können einige pervertieren Codierung wählen, wie ‚zip‘, ‚base64‘, ‚rot‘ und einige von ihnen werden von String in String konvertieren, aber ich glaube, der häufigste Fall ist, die beinhaltet UTF-8 / UTF-16 und String zurück.

mybytestring.encode (somecodec) ist sinnvoll, für diese Werte von somecodec:

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

Ich bin nicht sicher, was Decodierung ein bereits dekodiert Unicode-Text ist gut für. Der Versuch, dass mit jeder Codierung zu versuchen, immer scheint zuerst mit dem System des Standard-Kodierung zu kodieren.

Sie sollten Python UnicodeDecodeError lesen - Bin ich kodieren Missverständnis. Mein Verständnis von Unicode in Python war viel klarer, nachdem die akzeptierte Antwort zu lesen.

Es gibt ein paar Codierungen, die verwendet werden können, um de- / kodieren von str str oder von Unicode zu Unicode. Zum Beispiel base64, hex oder sogar rot13. Sie sind aufgelistet in der Codecs Modul .

Edit:

Die Decodier Nachricht auf einem Unicode-String kann die entsprechende Codierungsoperation rückgängig machen:

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

Der Rückgabetyp wird anstelle von Unicode-str, die meiner Meinung nach ist bedauerlich. Aber wenn Sie nicht einen richtigen Ver- / Dekodierungs zwischen str und unicode tun dies sieht aus wie ein Chaos sowieso.

Die einfache Antwort ist, dass sie das genaue Gegenteil voneinander sind.

der Computer die sehr grundlegende Einheit der Byte zu speichern und zu verarbeiten Informationen verwendet, ist es sinnlos, für das menschliche Auge.

zum Beispiel ‚\ XE4 \ XB8 \ xad \ XE6 \ x96 \ x87‘ ist die Darstellung von zwei chinesischen Schriftzeichen, aber der Computer nur weiß (was bedeutet, drucken oder speichern) es chinesische Schriftzeichen ist, wenn sie ein Wörterbuch angegeben Blick für das chinesische Wort, in diesem Fall ist es „utf-8“ Wörterbuch, und es wäre nicht richtig das beabsichtigte chinesische Wort zeigen, wenn Sie ein anderes oder falsch Wörterbuch sucht in (ein anderen Decodierungsverfahren verwendet wird).

Im obigen Fall wird das Verfahren für einen Computer für chinesisches Wort suchen decodiert ().

Und der Prozess des Computers die Chinesen in den Computerspeicher zu schreiben ist encode ().

so die kodieren Informationen das rohe Bytes, und die decodierte Information ist das rohe Bytes und der Name des Wörterbuchs zu verweisen (aber nicht das Wörterbuch selbst).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top