Python 3.x unterscheidet klar zwischen den Typen:
str
= '...'
Literale = eine Folge von Unicode-Zeichen (UTF-16 oder UTF-32, je nachdem, wie Python kompiliert wurde)
bytes
= b'...'
Literale = eine Folge von Oktetten (ganze Zahlen zwischen 0 und 255)
Wenn Sie mit Java oder C # vertraut sind, denken Sie an str
as String
und bytes
as byte[]
. Wenn Sie mit SQL vertraut sind, denken Sie an str
as NVARCHAR
und bytes
as BINARY
oder BLOB
. Wenn Sie mit der Windows-Registrierung vertraut sind, denken Sie an str
as REG_SZ
und bytes
as REG_BINARY
. Wenn Sie mit C (++) vertraut sind, vergessen Sie alles, was Sie gelernt haben, char
und Zeichenfolgen, da ein Zeichen kein Byte ist . Diese Idee ist längst überholt.
Sie verwenden, str
wenn Sie Text darstellen möchten.
print('שלום עולם')
Sie werden verwendet, bytes
wenn Sie binäre Daten auf niedriger Ebene wie Strukturen darstellen möchten.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Sie können a in ein Objekt codieren .str
bytes
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Und Sie können a bytes
in a dekodieren str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Sie können die beiden Typen jedoch nicht frei mischen.
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
Die b'...'
Notation ist insofern etwas verwirrend, als die Bytes 0x01-0x7F mit ASCII-Zeichen anstelle von Hex-Zahlen angegeben werden können.
>>> b'A' == b'\x41'
True
Aber ich muss betonen, ein Zeichen ist kein Byte .
>>> 'A' == b'A'
False
In Python 2.x.
In Versionen vor 3.0 von Python fehlte diese Unterscheidung zwischen Text und Binärdaten. Stattdessen gab es:
unicode
= u'...'
Literale = Folge von Unicode-Zeichen = 3.x.str
str
= '...'
Literale = Folgen von verwirrten Bytes / Zeichen
- Normalerweise Text, der in einer nicht spezifizierten Codierung codiert ist.
- Wird aber auch zur Darstellung von Binärdaten wie
struct.pack
Ausgabe verwendet.
Um den Übergang von 2.x zu 3.x zu vereinfachen, wurde die b'...'
Literal-Syntax auf Python 2.6 zurückportiert, um die Unterscheidung von Binärzeichenfolgen (die bytes
in 3.x sein sollten) von Textzeichenfolgen (die str
in 3 sein sollten) zu ermöglichen .x). Das b
Präfix führt in 2.x nichts aus, weist das 2to3
Skript jedoch an, es in 3.x nicht in eine Unicode-Zeichenfolge zu konvertieren.
Also ja, b'...'
Literale in Python haben den gleichen Zweck wie in PHP.
Gibt es aus Neugier mehr Symbole als das b und u, die andere Dinge tun?
Das r
Präfix erstellt eine unformatierte Zeichenfolge (z. B. r'\t'
ein Backslash + t
anstelle einer Registerkarte) und dreifache Anführungszeichen '''...'''
oder """..."""
lässt mehrzeilige Zeichenfolgenliterale zu.