Ich verstehe nicht kodieren und dekodieren in Python (2.7.3)

8

Ich habe versucht, selbst zu verstehen, encode und decode in Python, aber nichts ist wirklich klar für mich.

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

Erstens verstehe ich nicht die Notwendigkeit des Parameters "encoding" in diesen beiden Funktionen.

Was ist die Ausgabe jeder Funktion, ihre Kodierung? Was nutzt der Parameter "encoding" in jeder Funktion? Ich verstehe nicht wirklich die Definition von "Bytes String".

Ich habe eine wichtige Frage, gibt es einen Weg, von einer Kodierung zu einer anderen zu gelangen? Ich habe etwas Text über ASN.1 über "Oktett-String" gelesen, also fragte ich mich, ob es das gleiche wie "Bytes String" war.

Danke für Ihre Hilfe.

    
Narcisse Doudieu Siewe 21.07.2012, 23:30
quelle

4 Antworten

19

Es ist etwas komplexer in Python 2 (verglichen mit Python 3), da es die Konzepte von 'string' und 'bytestring' ziemlich zusammenfasst, aber siehe Das absolute Minimum, das jeder Softwareentwickler absolut, positiv über Unicode und Zeichensätze wissen muss . Im Wesentlichen müssen Sie verstehen, dass "string" und "character" abstrakte Konzepte sind, die nicht direkt von einem Computer dargestellt werden können. Ein Byte-String ist ein roher Stream von Bytes direkt von der Festplatte (oder der direkt von der Festplatte geschrieben werden kann). encode geht von abstrakt zu konkret (Sie geben es vorzugsweise eine Unicode-Zeichenfolge, und es gibt Ihnen eine Byte-Zeichenfolge zurück); decode geht den umgekehrten Weg.

Die Kodierung ist die Regel, die besagt, dass 'a' durch das Byte 0x61 und 'α' durch die Zwei-Byte-Sequenz 0xc0\xb1 dargestellt werden sollte.

    
lvc 21.07.2012, 23:42
quelle
14

Meine Präsentation von PyCon, Pragmatischer Unicode, oder, Wie kann ich den Schmerz stoppen deckt all diese Details ab.

Kurz gesagt, Unicode-Strings sind Sequenzen von Ganzzahlen, die Codepunkte genannt werden, und Bytestrings sind Sequenzen von Bytes. Eine Codierung ist eine Möglichkeit, Unicode-Codepunkte als eine Reihe von Bytes darzustellen. So wird unicode_string.encode(enc) die Byte-Zeichenkette der Unicode-Zeichenkette zurückgeben, die mit "enc" codiert ist, und byte_string.decode(enc) gibt die Unicode-Zeichenkette zurück, die durch die Decodierung der Byte-Zeichenkette mit "enc" erstellt wurde.

    
Ned Batchelder 22.07.2012 00:04
quelle
6

Python 2.x hat zwei Arten von Strings:

  • str ="byte strings" = eine Sequenz von Oktetten. Diese werden für beide "alten" Zeichencodierungen verwendet (wie windows-1252 oder IBM437 ) und für rohe Binärdaten (wie struct.pack output).
  • unicode ="Unicode-Zeichenfolgen" = eine Folge von UTF-16 oder UTF-32 abhängig davon, wie Python aufgebaut ist.

Dieses Modell war für Python 3.x geändert :

  • 2.x unicode wurde 3.x str (und das Präfix u wurde aus den Literalen entfernt).
  • Ein bytes Typ wurde für die Darstellung von Binärdaten eingeführt.

Eine Zeichenkodierung ist eine Zuordnung zwischen Unicode-Strings und Byte-Strings. Um eine Unicode-Zeichenfolge in eine Byte-Zeichenfolge zu konvertieren, verwenden Sie die Methode encode :

%Vor%

Um den umgekehrten Weg zu finden, verwenden Sie die Methode decode :

%Vor%     
dan04 21.07.2012 23:59
quelle
4

Ja, eine Byte-Zeichenfolge ist eine Oktett-Zeichenfolge. Die Codierung und Decodierung erfolgt beim Eingeben / Ausgeben von Text (von / zur Konsole, Dateien, dem Netzwerk, ...). Ihre Konsole kann UTF-8 intern verwenden, Ihr Webserver dient latin-1, und bestimmte Dateiformate benötigen seltsame Kodierungen wie Bibtex's Akzente: fran\c{c}aise . Sie müssen von / zu ihnen bei Eingabe / Ausgabe konvertieren.

Die Methoden {en|de}code tun dies. Sie werden oft hinter den Kulissen aufgerufen (zum Beispiel codiert print "hello world" die Zeichenfolge an das, was auch immer Ihr Terminal verwendet).

    
tiwo 21.07.2012 23:42
quelle

Tags und Links