Ich arbeite mit einer Bibliothek, die eine Byte-Zeichenfolge zurückgibt, und ich muss diese in eine Zeichenfolge konvertieren.
Obwohl ich nicht sicher bin, was der Unterschied ist - wenn überhaupt.
Angenommen, Python 3 (in Python 2 ist dieser Unterschied etwas weniger genau definiert) - eine Zeichenfolge ist eine Folge von Zeichen, dh Unicode-Codepunkten ; Dies ist ein abstraktes Konzept und kann nicht direkt auf der Festplatte gespeichert werden. Ein Byte - String ist eine Folge von, wenig überraschend, Byte - Dinge , die können auf der Festplatte gespeichert werden. Die Zuordnung zwischen ihnen ist eine Codierung - es gibt ziemlich viele davon (und unendlich viele sind möglich) - und Sie müssen wissen, welche im jeweiligen Fall gilt, um die Konvertierung durchzuführen, da eine andere Codierung dieselben Bytes zuordnen kann zu einer anderen Zeichenfolge:
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'
Sobald Sie wissen, welche Sie verwenden sollen, können Sie die .decode()
Methode der Byte-Zeichenfolge verwenden, um wie oben die richtige Zeichenfolge daraus zu erhalten. Der Vollständigkeit .encode()
halber geht die Methode einer Zeichenkette in die entgegengesetzte Richtung:
>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
str
Typ ist der gleiche wie derbytes
Typ. Diese Antwort vergleicht denunicode
Typ (der in Python 3 nicht vorhanden ist) mit demstr
Typ.str
Objekten ist von Python-Seite nicht zugänglich oder relevant. Die Datenstruktur ist nur eine Folge von Codepunkten. Unter PEP 393 ist die genaue interne Codierung eine von Latin-1, UCS2 oder UCS4, und eine utf-8-Darstellung kann nach der ersten Anforderung zwischengespeichert werden, aber selbst C-Code wird davon abgehalten, sich auf diese internen Details zu verlassen.Das einzige, was ein Computer speichern kann, sind Bytes.
Um etwas auf einem Computer zu speichern, müssen Sie es zuerst codieren , dh in Bytes konvertieren. Beispielsweise:
MP3
,WAV
usw.PNG
,JPEG
usw.ASCII
,UTF-8
usw.MP3
,WAV
,PNG
,JPEG
,ASCII
UndUTF-8
sind Beispiele für Codierungen . Eine Codierung ist ein Format zur Darstellung von Audio, Bildern, Text usw. in Bytes.In Python ist eine Byte-Zeichenfolge genau das: eine Folge von Bytes. Es ist nicht für Menschen lesbar. Unter der Haube muss alles in eine Byte-Zeichenfolge konvertiert werden, bevor es in einem Computer gespeichert werden kann.
Andererseits ist eine Zeichenfolge, die oft nur als "Zeichenfolge" bezeichnet wird, eine Folge von Zeichen. Es ist für Menschen lesbar. Eine Zeichenfolge kann nicht direkt auf einem Computer gespeichert werden, sondern muss zuerst codiert (in eine Bytezeichenfolge konvertiert) werden. Es gibt mehrere Codierungen, durch die eine Zeichenfolge in eine Bytezeichenfolge wie
ASCII
und konvertiert werden kannUTF-8
.Der obige Python-Code codiert die Zeichenfolge
'I am a string'
mithilfe der CodierungASCII
. Das Ergebnis des obigen Codes ist eine Bytezeichenfolge. Wenn Sie es drucken, wird es von Python als dargestelltb'I am a string'
. Denken Sie jedoch daran, dass Byte-Strings nicht für Menschen lesbar sind. Python dekodiert sie nur,ASCII
wenn Sie sie drucken. In Python wird eine Bytezeichenfolge durch a dargestelltb
, gefolgt von derASCII
Darstellung der Bytezeichenfolge .Eine Byte-Zeichenfolge kann sein wieder in eine Zeichenfolge dekodiert werden , wenn Sie die Codierung kennen, mit der sie codiert wurde.
Der obige Code gibt die ursprüngliche Zeichenfolge zurück
'I am a string'
.Codierung und Decodierung sind inverse Operationen. Alles muss codiert sein, bevor es auf die Festplatte geschrieben werden kann, und es muss decodiert werden, bevor es von einem Menschen gelesen werden kann.
quelle
Hinweis: Ich werde meine Antwort für Python 3 näher erläutern, da das Lebensende von Python 2 sehr nahe ist.
In Python 3
bytes
besteht aus Sequenzen von vorzeichenlosen 8-Bit-Werten, während esstr
aus Sequenzen von Unicode-Codepunkten besteht, die Textzeichen aus menschlichen Sprachen darstellen.Obwohl
bytes
undstr
scheinen auf die gleiche Weise zu funktionieren, sind ihre Instanzen nicht miteinander kompatibel, dhbytes
undstr
Instanzen können nicht zusammen mit Operatoren wie>
und verwendet werden+
. Beachten Sie außerdem, dass Vergleichebytes
undstr
Instanzen für Gleichheit, dh Verwenden==
, immer ausgewertet werden,False
auch wenn sie genau dieselben Zeichen enthalten.Ein weiteres Problem beim Umgang mit
bytes
undstr
bei der Arbeit mit Dateien, die mit dem zurückgegeben werdenopen
integrierten Funktion zurückgegeben werden. Wenn Sie einerseits Binärdaten in / aus einer Datei lesen oder schreiben möchten, öffnen Sie die Datei immer in einem Binärmodus wie 'rb' oder 'wb'. Wenn Sie andererseits Unicode-Daten in / aus einer Datei lesen oder schreiben möchten, beachten Sie die Standardcodierung Ihres Computers. Übergeben Sie daher gegebenenfalls denencoding
Parameter, um Überraschungen zu vermeiden.In Python 2
str
besteht aus Sequenzen von 8-Bit-Werten, während esunicode
aus Sequenzen von Unicode-Zeichen besteht. Eine Sache zu beachten ist, dassstr
undunicode
kann zusammen mit Bedienern verwendet werden, wennstr
nur besteht aus 7-Bit - ASCI Zeichen.Es kann nützlich sein, Hilfsfunktionen zum Konvertieren zwischen
str
undunicode
in Python 2 sowie zwischenbytes
undstr
in Python 3 zu verwenden.quelle
Aus Was ist Unicode :
Wenn ein Computer eine Zeichenfolge darstellt, findet er Zeichen, die im Computer der Zeichenfolge gespeichert sind, anhand ihrer eindeutigen Unicode-Nummer, und diese Zahlen werden im Speicher gespeichert. Sie können die Zeichenfolge jedoch nicht direkt auf die Festplatte schreiben oder über ihre eindeutige Unicode-Nummer im Netzwerk übertragen, da es sich bei diesen Zahlen nur um einfache Dezimalzahlen handelt. Sie sollten die Zeichenfolge in eine Bytezeichenfolge codieren, z
UTF-8
.UTF-8
ist eine Zeichenkodierung, die alle möglichen Zeichen kodieren kann und Zeichen als Bytes speichert (es sieht so ). Die codierte Zeichenfolge kann also überall verwendet werden, da sieUTF-8
fast überall unterstützt wird. Wenn Sie eine in codierte Textdatei öffnenUTF-8
Von anderen Systemen dekodiert Ihr Computer es und zeigt die darin enthaltenen Zeichen anhand ihrer eindeutigen Unicode-Nummer an. Wenn ein BrowserUTF-8
vom Netzwerk codierte Zeichenfolgendaten empfängt , dekodiert er die Daten in Zeichenfolgen (vorausgesetzt, der BrowserUTF-8
codiert) und zeigt die Zeichenfolge an.In Python3 können Sie Zeichenfolge und Byte-Zeichenfolge ineinander umwandeln:
Mit einem Wort, Zeichenfolge dient zum Anzeigen für Menschen zum Lesen auf einem Computer und Byte-Zeichenfolge zum Speichern auf Festplatte und zur Datenübertragung.
quelle
Unicode ist ein vereinbartes Format für die binäre Darstellung von Zeichen und verschiedene Arten der Formatierung (z. B. Klein- / Großbuchstaben, neue Zeile, Wagenrücklauf) und andere "Dinge" (z. B. Emojis). Ein Computer ist nicht weniger in der Lage, eine Unicode-Darstellung (eine Reihe von Bits) im Speicher oder in einer Datei zu speichern, als eine ASCII-Darstellung (eine andere Reihe von Bits) oder eine andere Darstellung (Reihe von Bits) zu speichern ).
Damit die Kommunikation stattfinden kann, müssen die Parteien der Kommunikation vereinbaren, welche Vertretung verwendet wird.
Weil Unicode versucht, alle darzustellen möglichen Zeichen (und andere "Dinge") die in der Kommunikation zwischen Mensch und Computer verwendet werden, erfordert es eine größere Anzahl von Bits für die Darstellung vieler Zeichen (oder Dinge) als andere Darstellungssysteme, die versuchen, eine begrenzte Anzahl von Charakteren / Dingen darzustellen. Zur "Vereinfachung" und möglicherweise zur Berücksichtigung der historischen Verwendung wird die Unicode-Darstellung fast ausschließlich in ein anderes Darstellungssystem (z. B. ASCII) konvertiert, um Zeichen in Dateien zu speichern.
Es ist nicht der Fall , die Unicode kann nicht zum Speichern von Zeichen in Dateien verwendet werden, oder sie durch Übertragung von jedem Kommunikationskanal, einfach , dass es ist nicht.
Der Begriff "Zeichenfolge" ist nicht genau definiert. "String" bezieht sich im allgemeinen Sprachgebrauch auf eine Reihe von Zeichen / Dingen. In einem Computer können diese Zeichen in einer von vielen verschiedenen bitweisen Darstellungen gespeichert werden. Eine "Byte-Zeichenfolge" ist ein Satz von Zeichen, die unter Verwendung einer Darstellung gespeichert werden, die acht Bits verwendet (acht Bits werden als Byte bezeichnet). Da Computer heutzutage das Unicode-System (Zeichen, die durch eine variable Anzahl von Bytes dargestellt werden) zum Speichern von Zeichen im Speicher und Byte-Zeichenfolgen (Zeichen, die durch einzelne Bytes dargestellt werden) zum Speichern von Zeichen in Dateien verwenden, muss vor den dargestellten Zeichen eine Konvertierung verwendet werden im Speicher wird in Dateien gespeichert.
quelle
Lassen Sie uns eine einfache Zeichenfolge mit einem Zeichen haben
'š'
und sie in eine Folge von Bytes codieren:In diesem Beispiel zeigen wir die Folge von Bytes in ihrer binären Form an:
Jetzt ist es im Allgemeinen nicht möglich , die Informationen zurück zu decodieren, ohne zu wissen, wie sie codiert wurden. Nur wenn Sie wissen, dass die
utf-8
Textcodierung verwendet wurde, können Sie dem Algorithmus zum Decodieren von utf-8 folgen und die ursprüngliche Zeichenfolge abrufen :Sie können die Binärzahl
101100001
wieder als Zeichenfolge anzeigen :quelle
Die Python-Sprachen enthalten
str
undbytes
standardmäßig "Integrierte Typen". Mit anderen Worten, sie sind beide Klassen. Ich denke nicht, dass es sich lohnt zu erklären, warum Python auf diese Weise implementiert wurde.Trotzdem
str
undbytes
sind einander sehr ähnlich. Beide teilen die meisten der gleichen Methoden. Die folgenden Methoden sind für diestr
Klasse einzigartig :Die folgenden Methoden sind für die
bytes
Klasse einzigartig :quelle