Python Language Stringhe: byte contro Unicode


Esempio

Python 2.x 2.7

In Python 2 ci sono due varianti di stringa: quelle fatte di byte con tipo ( str ) e quelle fatte di testo con tipo ( unicode ).

In Python 2, un oggetto di tipo str è sempre una sequenza di byte, ma è comunemente usato sia per i dati di testo che per quelli binari.

Una stringa letterale viene interpretata come una stringa di byte.

s = 'Cafe'    # type(s) == str

Ci sono due eccezioni: puoi definire un letterale Unicode (testo) esplicitamente prefiggendo il letterale con u :

s = u'Café'   # type(s) == unicode
b = 'Lorem ipsum'  # type(b) == str

In alternativa, è possibile specificare che i valori letterali stringa di un intero modulo devono creare valori letterali Unicode (testo):

from __future__ import unicode_literals

s = 'Café'   # type(s) == unicode
b = 'Lorem ipsum'  # type(b) == unicode

Per verificare se la variabile è una stringa (Unicode o una stringa di byte), puoi utilizzare:

isinstance(s, basestring)
Python 3.x 3.0

In Python 3, il tipo str è un tipo di testo Unicode.

s = 'Cafe'           # type(s) == str
s = 'Café'           # type(s) == str (note the accented trailing e)

Inoltre, Python 3 ha aggiunto un oggetto bytes , adatto per "blob" binari o per scrivere in file indipendenti dalla codifica. Per creare un oggetto bytes, puoi anteporre b a un letterale stringa o chiamare il metodo encode della stringa:

# Or, if you really need a byte string:
s = b'Cafe'          # type(s) == bytes
s = 'Café'.encode()  # type(s) == bytes

Per verificare se un valore è una stringa, utilizzare:

isinstance(s, str)
Python 3.x 3.3

È anche possibile prefissare i letterali stringa con un prefisso u per facilitare la compatibilità tra le basi di codice Python 2 e Python 3. Poiché, in Python 3, tutte le stringhe sono Unicode per impostazione predefinita, la preposizione di una stringa letterale con u non ha alcun effetto:

u'Cafe' == 'Cafe'

Il prefisso di stringa Unicode non ur Python 2 non è supportato, tuttavia:

>>> ur'Café'
  File "<stdin>", line 1
    ur'Café'
           ^
SyntaxError: invalid syntax

Nota che devi encode un oggetto testo ( str ) Python 3 per convertirlo in una rappresentazione in bytes di quel testo. La codifica predefinita di questo metodo è UTF-8 .

Puoi utilizzare la decode per chiedere a un oggetto bytes quale testo Unicode rappresenta:

>>> b.decode()
'Café'
Python 2.x 2.6

Mentre il tipo di bytes esiste sia in Python 2 che in 3, il tipo unicode esiste solo in Python 2. Per usare le stringhe Unicode implicite di Python 3 in Python 2, aggiungi quanto segue all'inizio del tuo file di codice:

from __future__ import unicode_literals
print(repr("hi"))
# u'hi'
Python 3.x 3.0

Un'altra importante differenza è che l'indicizzazione dei byte in Python 3 ha come risultato un output int simile:

b"abc"[0] == 97

Mentre l'affettatura in una dimensione di un risultato in un oggetto di lunghezza 1 byte:

b"abc"[0:1] == b"a"

Inoltre, Python 3 corregge alcuni comportamenti insoliti con unicode, ovvero invertendo le stringhe di byte in Python 2. Ad esempio, il seguente problema è stato risolto:

# -*- coding: utf8 -*-
print("Hi, my name is Łukasz Langa.")
print(u"Hi, my name is Łukasz Langa."[::-1])
print("Hi, my name is Łukasz Langa."[::-1])

# Output in Python 2
# Hi, my name is Łukasz Langa.
# .agnaL zsakuŁ si eman ym ,iH
# .agnaL zsaku�� si eman ym ,iH

# Output in Python 3
# Hi, my name is Łukasz Langa.
# .agnaL zsakuŁ si eman ym ,iH
# .agnaL zsakuŁ si eman ym ,iH