Risposte:
Supponendo Python 3 (in Python 2, questa differenza è un po 'meno ben definita) - una stringa è una sequenza di caratteri, cioè punti di codice unicode ; questi sono concetti astratti e non possono essere archiviati direttamente su disco. Una stringa di byte è una sequenza, ovviamente, di byte: elementi che possono essere memorizzati su disco. La mappatura tra loro è una codifica - ce ne sono molte (e infinitamente molte sono possibili) - e devi sapere quale si applica nel caso particolare per fare la conversione, poiché una codifica diversa può mappare gli stessi byte a una stringa diversa:
>>> 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ς'
Una volta che sai quale usare, puoi usare il .decode()
metodo della stringa di byte per ottenere la stringa di caratteri corretta come sopra. Per completezza, il .encode()
metodo di una stringa di caratteri va nella direzione opposta:
>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
str
oggetti Python 3 non è accessibile o rilevante dal lato Python; la struttura dei dati è solo una sequenza di punti di codice. In base a PEP 393 , la codifica interna esatta è una di Latin-1, UCS2 o UCS4 e una rappresentazione utf-8 può essere memorizzata nella cache dopo che è stata richiesta per la prima volta, ma anche il codice C è scoraggiato dal fare affidamento su questi dettagli interni.
L'unica cosa che un computer può memorizzare sono i byte.
Per archiviare qualsiasi cosa in un computer, devi prima codificarlo , ovvero convertirlo in byte. Per esempio:
MP3
, WAV
eccPNG
, JPEG
eccASCII
, UTF-8
eccMP3
, WAV
, PNG
, JPEG
, ASCII
E UTF-8
sono esempi di codifiche . Una codifica è un formato per rappresentare audio, immagini, testo, ecc. In byte.
In Python, una stringa di byte è proprio questa: una sequenza di byte. Non è leggibile dall'uomo. Sotto il cofano, tutto deve essere convertito in una stringa di byte prima di poter essere memorizzato in un computer.
D'altra parte, una stringa di caratteri, spesso chiamata semplicemente "stringa", è una sequenza di caratteri. È leggibile dall'uomo. Una stringa di caratteri non può essere archiviata direttamente in un computer, deve essere prima codificata (convertita in una stringa di byte). Esistono più codifiche attraverso le quali una stringa di caratteri può essere convertita in una stringa di byte, come ASCII
e UTF-8
.
'I am a string'.encode('ASCII')
Il codice Python sopra codificherà la stringa 'I am a string'
usando la codifica ASCII
. Il risultato del codice sopra sarà una stringa di byte. Se lo stampi, Python lo rappresenterà come b'I am a string'
. Ricorda, tuttavia, che le stringhe di byte non sono leggibili dall'uomo , è solo che Python le decodifica da ASCII
quando le stampi. In Python, una stringa di byte è rappresentata da a b
, seguita dalla ASCII
rappresentazione della stringa di byte .
Una stringa di byte può essere decodificata nuovamente in una stringa di caratteri, se si conosce la codifica utilizzata per codificarla.
b'I am a string'.decode('ASCII')
Il codice sopra restituirà la stringa originale 'I am a string'
.
La codifica e la decodifica sono operazioni inverse. Tutto deve essere codificato prima di poter essere scritto su disco e deve essere decodificato prima di poter essere letto da un essere umano.
Nota: elaborerò di più la mia risposta per Python 3 poiché la fine della vita di Python 2 è molto vicina.
In Python 3
bytes
è costituito da sequenze di valori senza segno a 8 bit, mentre è str
costituito da sequenze di punti di codice Unicode che rappresentano caratteri testuali da linguaggi umani.
>>> # 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)
naïve
Anche se bytes
e str
sembra funzionare allo stesso modo, i loro casi non sono compatibili tra di loro, vale a dire, bytes
e str
le istanze non possono essere utilizzati insieme con gli operatori come >
e +
. Inoltre, tieni presente che il confronto bytes
e le str
istanze per l'uguaglianza, ovvero l'utilizzo ==
, valuteranno sempre False
anche quando contengono esattamente gli stessi caratteri.
>>> # 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
Un altro problema quando si ha a che fare con bytes
ed str
è presente quando si lavora con file restituiti utilizzando la open
funzione integrata. Da un lato, se desideri leggere o scrivere dati binari su / da un file, apri sempre il file usando una modalità binaria come 'rb' o 'wb'. D'altra parte, se si desidera leggere o scrivere dati Unicode su / da un file, tenere presente la codifica predefinita del computer, quindi, se necessario, passare il encoding
parametro per evitare sorprese.
In Python 2
str
è costituito da sequenze di valori a 8 bit, mentre è unicode
costituito da sequenze di caratteri Unicode. Una cosa da tenere a mente è che str
e unicode
possono essere utilizzati insieme con gli operatori, se str
solo si compone di caratteri ASCI 7-bit.
Potrebbe essere utile utilizzare le funzioni di supporto per convertire tra str
e unicode
in Python 2 e tra bytes
e str
in Python 3.
Da Cos'è Unicode :
Fondamentalmente, i computer gestiscono solo i numeri. Memorizzano lettere e altri caratteri assegnando un numero a ciascuno.
......
Unicode fornisce un numero univoco per ogni personaggio, qualunque sia la piattaforma, qualunque sia il programma, qualunque sia la lingua.
Quindi, quando un computer rappresenta una stringa, trova i caratteri memorizzati nel computer della stringa attraverso il loro numero Unicode univoco e queste figure sono memorizzate. Ma non puoi scrivere direttamente la stringa su disco o trasmettere la stringa in rete attraverso il loro numero Unicode univoco perché queste cifre sono solo un semplice numero decimale. È necessario codificare la stringa in stringa di byte, ad esempio UTF-8
. UTF-8
è un personaggio codifica in grado di codificare tutti i possibili caratteri e lo memorizza come caratteri byte (sembra questo ). Quindi la stringa codificata può essere utilizzata ovunque perché UTF-8
è quasi supportata ovunque. Quando si apre un file di testo codificatoUTF-8
da altri sistemi, il computer lo decodificherà e visualizzerà i caratteri in esso tramite il loro numero Unicode univoco. Quando un browser riceve i dati di stringa codificati UTF-8
dalla rete, li decodifica in stringa (presuppone il browser nella UTF-8
codifica) e visualizza la stringa.
In python3, puoi trasformare stringa e stringa di byte l'una con l'altra:
>>> print('中文'.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
中文
In una parola, stringa è per essere mostrato agli umani per leggere su un computer e stringa di byte per l'archiviazione su disco e trasmissione dei dati.
Unicode è un formato concordato per la rappresentazione binaria di caratteri e vari tipi di formattazione (ad esempio lettere minuscole / maiuscole, nuova riga, ritorno a capo) e altre "cose" (ad esempio emoji). Un computer non è meno in grado di memorizzare una rappresentazione unicode (una serie di bit), sia in memoria che in un file, piuttosto che memorizzare una rappresentazione ASCII (una diversa serie di bit) o qualsiasi altra rappresentazione (serie di bit ).
Affinché la comunicazione abbia luogo, le parti della comunicazione devono concordare quale rappresentazione verrà utilizzata.
Poiché unicode cerca di rappresentare tutti i possibili caratteri (e altre "cose") utilizzati nella comunicazione interumana e tra computer, richiede un numero maggiore di bit per la rappresentazione di molti caratteri (o cose) rispetto ad altri sistemi di rappresentazione che cercare di rappresentare un insieme più limitato di personaggi / cose. Per "semplificare" e forse per adattarsi all'uso storico, la rappresentazione unicode viene quasi esclusivamente convertita in qualche altro sistema di rappresentazione (ad esempio ascii) allo scopo di memorizzare caratteri nei file.
Non è possibile che Unicode non possa essere utilizzato per archiviare caratteri nei file o trasmetterli attraverso qualsiasi canale di comunicazione, semplicemente che non lo è .
Il termine "stringa" non è definito con precisione. "Stringa", nel suo uso comune, si riferisce a un insieme di caratteri / cose. In un computer, quei caratteri possono essere memorizzati in una qualsiasi delle diverse rappresentazioni bit per bit. Una "stringa di byte" è un insieme di caratteri archiviati utilizzando una rappresentazione che utilizza otto bit (otto bit indicati come byte). Poiché in questi giorni i computer utilizzano il sistema unicode (caratteri rappresentati da un numero variabile di byte) per memorizzare i caratteri in memoria e stringhe di byte (caratteri rappresentati da singoli byte) per archiviare i caratteri in file, è necessario utilizzare una conversione prima dei caratteri rappresentati in memoria verrà spostato nella memoria dei file.
Diamo una semplice stringa di un carattere 'š'
e la codifichiamo in una sequenza di byte:
>>> 'š'.encode('utf-8')
b'\xc5\xa1'
Ai fini di questo esempio, visualizziamo la sequenza di byte nella sua forma binaria:
>>> bin(int(b'\xc5\xa1'.hex(), 16))
'0b1100010110100001'
Ora in genere non è possibile decodificare le informazioni senza sapere come sono state codificate. Solo se sai che è utf-8
stata utilizzata la codifica del testo, puoi seguire l' algoritmo per decodificare utf-8 e acquisire la stringa originale:
11000101 10100001
^^^^^ ^^^^^^
00101 100001
È possibile visualizzare 101100001
nuovamente il numero binario come stringa:
>>> chr(int('101100001', 2))
'š'
I linguaggi Python includono str
e bytes
come "Tipi predefiniti" standard. In altre parole, sono entrambe le classi. Non credo valga la pena provare a razionalizzare il motivo per cui Python è stato implementato in questo modo.
Detto questo, str
e bytes
sono molto simili tra loro. Entrambi condividono la maggior parte degli stessi metodi. I seguenti metodi sono unici per la str
classe:
casefold
encode
format
format_map
isdecimal
isidentifier
isnumeric
isprintable
I seguenti metodi sono unici per la bytes
classe:
decode
fromhex
hex
str
tipo è uguale albytes
tipo; questa risposta confronta in modo equivalente ilunicode
tipo (non esiste in Python 3) con ilstr
tipo.