388 Stimmen

Was ist der Unterschied zwischen einem String und einem Byte-String?

Ich arbeite mit einer Bibliothek, die einen "Byte-String" zurückgibt ( bytes ) und ich muss diese in eine Zeichenkette umwandeln.

Gibt es eigentlich einen Unterschied zwischen diesen beiden Dingen? Wie hängen sie zusammen, und wie kann ich die Umrechnung vornehmen?

746voto

Zenadix Punkte 13273

Das einzige, was ein Computer speichern kann, sind Bytes.

Um etwas in einem Computer zu speichern, müssen Sie zunächst verschlüsseln zu konvertieren, d.h. in Bytes zu konvertieren. Zum Beispiel:

  • Wenn Sie Musik speichern möchten, müssen Sie zunächst verschlüsseln es mit MP3 , WAV , usw.
  • Wenn Sie ein Bild speichern möchten, müssen Sie zunächst verschlüsseln es mit PNG , JPEG , usw.
  • Wenn Sie Text speichern wollen, müssen Sie zunächst verschlüsseln es mit ASCII , UTF-8 , usw.

MP3, WAV, PNG, JPEG, ASCII und UTF-8 sind Beispiele für Kodierungen . Eine Kodierung ist ein Format zur Darstellung von Audio, Bildern, Text usw. in Bytes.

In Python ist eine Bytefolge genau das: eine Folge von Bytes. Sie ist nicht für Menschen lesbar. Unter der Haube muss alles in eine Byte-Zeichenkette umgewandelt werden, bevor es in einem Computer gespeichert werden kann.

Eine Zeichenkette hingegen, oft auch nur "String" genannt, ist eine Folge von Zeichen. Sie ist für Menschen lesbar. Eine Zeichenkette kann nicht direkt in einem Computer gespeichert werden, sie muss verschlüsselt zuerst (umgewandelt in eine Byte-Zeichenkette). Es gibt mehrere Kodierungen, mit denen eine Zeichenkette in eine Byte-Zeichenkette umgewandelt werden kann, z. B. ASCII und UTF-8.

'I am a string'.encode('ASCII')

Der obige Python-Code kodiert die Zeichenkette Ich bin ein String". unter Verwendung der Kodierung ASCII. Das Ergebnis des obigen Codes ist eine Byte-Zeichenkette. Wenn Sie sie ausdrucken, wird sie von Python wie folgt dargestellt b'I am a string' . Bedenken Sie jedoch, dass Byte-Strings nicht für Menschen lesbar sind Es ist nur so, dass Python sie aus ASCII dekodiert, wenn Sie sie drucken. In Python wird eine Byte-Zeichenkette durch eine b , gefolgt von der ASCII-Darstellung der Byte-Zeichenkette.

Eine Byte-Zeichenkette kann sein entschlüsselt in eine Zeichenkette zurückverwandeln, wenn Sie die Kodierung kennen, mit der sie kodiert wurde.

b'I am a string'.decode('ASCII')

Der obige Code gibt die ursprüngliche Zeichenkette zurück 'I am a string' .

Kodierung und Dekodierung sind inverse Operationen. Alles muss kodiert werden, bevor es auf die Festplatte geschrieben werden kann, und es muss dekodiert werden, bevor es von einem Menschen gelesen werden kann.

363voto

lvc Punkte 32687

Unter der Annahme, dass Python 3 (in Python 2 ist dieser Unterschied etwas weniger klar definiert) - eine Zeichenkette eine Folge von Zeichen ist, d.h. Unicode-Codepunkte Diese sind ein abstraktes Konzept und können nicht direkt auf der Festplatte gespeichert werden. Eine Byte-Zeichenkette ist eine Folge von Bytes - Dinge, die puede auf der Festplatte gespeichert werden. Die Zuordnung zwischen ihnen ist eine Kodierung - gibt es eine ganze Menge davon (und es sind unendlich viele möglich) - und man muss wissen, welche im konkreten Fall zutrifft, um die Konvertierung durchzuführen, da eine andere Kodierung dieselben Bytes auf eine andere Zeichenkette abbilden kann:

>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
''
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'oo'

Sobald Sie wissen, welche Sie verwenden müssen, können Sie die .decode() Methode der Byte-Zeichenkette, um die richtige Zeichenkette wie oben zu erhalten. Der Vollständigkeit halber sei erwähnt, dass die .encode() Methode einer Zeichenkette geht den umgekehrten Weg:

>>> 'oo'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'

34voto

lmiguelvargasf Punkte 50452

Anmerkung: Ich werde meine Antwort für Python 3 weiter ausarbeiten, da das Ende der Lebensdauer von Python 2 sehr nahe ist.

In Python 3

bytes besteht aus Folgen von 8-Bit-Werten ohne Vorzeichen, während str besteht aus Folgen von Unicode-Codepunkten, die Textzeichen aus menschlichen Sprachen darstellen.

>>> # bytes
>>> b = b'h\x65llo'
>>> type(b)
<class 'bytes'>
>>> list(b)
[104, 101, 108, 108, 111]
>>> print(b)
b'hello'
>>>
>>> # str
>>> s = 'nai\u0308ve'
>>> type(s)
<class 'str'>
>>> list(s)
['n', 'a', 'i', '', 'v', 'e']
>>> print(s)
naive

Auch wenn bytes y str auf die gleiche Weise zu funktionieren scheinen, sind ihre Instanzen nicht miteinander kompatibel, d.h, bytes y str Instanzen können nicht zusammen mit Operatoren verwendet werden wie > y + . Außerdem ist zu bedenken, dass ein Vergleich bytes y str Instanzen auf Gleichheit, d.h. mit == wird immer ausgewertet zu False auch wenn sie genau dieselben Zeichen enthalten.

>>> # concatenation
>>> b'hi' + b'bye' # this is possible
b'hibye'
>>> 'hi' + 'bye' # this is also possible
'hibye'
>>> b'hi' + 'bye' # this will fail
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat str to bytes
>>> 'hi' + b'bye' # this will also fail
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "bytes") to str
>>>
>>> # comparison
>>> b'red' > b'blue' # this is possible
True
>>> 'red'> 'blue' # this is also possible
True
>>> b'red' > 'blue' # you can't compare bytes with str
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'bytes' and 'str'
>>> 'red' > b'blue' # you can't compare str with bytes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'str' and 'bytes'
>>> b'blue' == 'red' # equality between str and bytes always evaluates to False
False
>>> b'blue' == 'blue' # equality between str and bytes always evaluates to False
False

Ein weiteres Problem beim Umgang mit bytes y str ist vorhanden, wenn mit Dateien gearbeitet wird, die mit der Funktion open eingebaute Funktion. Wenn Sie einerseits binäre Daten aus einer Datei lesen oder in eine Datei schreiben wollen, öffnen Sie die Datei immer in einem Binärmodus wie 'rb' oder 'wb'. Wenn Sie andererseits Unicode-Daten aus einer Datei lesen oder in eine Datei schreiben wollen, achten Sie auf die Standardkodierung Ihres Computers und übergeben Sie gegebenenfalls die encoding Parameter, um Überraschungen zu vermeiden.

In Python 2

str besteht aus Folgen von 8-Bit-Werten, während unicode besteht aus Folgen von Unicode-Zeichen. Eine Sache, die Sie beachten sollten, ist, dass str y unicode kann zusammen mit Operatoren verwendet werden, wenn str besteht nur aus 7-Bit-ASCI-Zeichen.

Es könnte nützlich sein, Hilfsfunktionen zu verwenden, um zwischen str y unicode in Python 2, und zwischen bytes y str in Python 3.

8voto

Jeyekomon Punkte 2288

Nehmen wir eine einfache einstellige Zeichenfolge 'š' und kodieren sie in eine Folge von Bytes:

>>> 'š'.encode('utf-8')
b'\xc5\xa1'

Für dieses Beispiel wird die Bytefolge in ihrer binären Form dargestellt:

>>> bin(int(b'\xc5\xa1'.hex(), 16))
'0b1100010110100001'

Jetzt ist es generell nicht möglich die Informationen zurück zu dekodieren, ohne zu wissen, wie sie kodiert wurden. Nur wenn Sie wissen, dass die Textkodierung UTF-8 verwendet wurde, können Sie die Algorithmus zur Dekodierung von UTF-8 und erwerben die ursprüngliche Zeichenfolge:

11000101 10100001
   ^^^^^   ^^^^^^
   00101   100001

Sie können die Binärzahl anzeigen 101100001 als Zeichenkette zurück:

>>> chr(int('101100001', 2))
'š'

6voto

Sam Yang Punkte 531

En Was ist Unicode? :

Im Grunde genommen arbeiten Computer nur mit Zahlen. Sie speichern Buchstaben und andere Zeichen, indem sie jedem Zeichen eine Nummer zuordnen.

......

Unicode bietet eine eindeutige Nummer für jedes Zeichen, unabhängig von der Plattform, dem Programm und der Sprache.

Wenn also ein Computer eine Zeichenkette darstellt, findet er die im Computer gespeicherten Zeichen der Zeichenkette anhand ihrer eindeutigen Unicode-Nummer, und diese Zahlen werden im Speicher abgelegt. Aber Sie können die Zeichenfolge nicht direkt auf die Festplatte schreiben oder die Zeichenfolge über das Netzwerk durch ihre eindeutige Unicode-Nummer übertragen, weil diese Zahlen nur einfache Dezimalzahlen sind. Sie sollten die Zeichenfolge in eine Byte-Zeichenkette kodieren, z. B. UTF-8 . UTF-8 ist eine Zeichenkodierung, die alle möglichen Zeichen kodieren kann und die Zeichen als Bytes speichert (sie sieht aus wie este ). Die kodierte Zeichenfolge kann also überall verwendet werden, da UTF-8 fast überall unterstützt wird. Wenn Sie eine in UTF-8 kodierte Textdatei von einem anderen System aus öffnen, wird Ihr Computer sie dekodieren und die Zeichen darin durch ihre eindeutige Unicode-Nummer anzeigen.

Wenn ein Browser UTF-8-kodierte Zeichenkettendaten aus dem Netz empfängt, dekodiert er die Daten in eine Zeichenkette (der Browser geht von einer UTF-8-Kodierung aus) und zeigt die Zeichenkette an.

In Python 3 können Sie String und Byte-String ineinander umwandeln:

>>> print(''.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))

Mit einem Wort, String ist für die Anzeige für Menschen auf einem Computer zu lesen und Byte-String ist für die Speicherung auf Festplatte und Datenübertragung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X