Python Language Chaînes: Octets versus Unicode


Exemple

Python 2.x 2.7

En Python 2, il existe deux variantes de chaîne: celles faites d’octets de type ( str ) et celles de texte de type ( unicode ).

Dans Python 2, un objet de type str est toujours une séquence d'octets, mais est couramment utilisé à la fois pour les données textuelles et binaires.

Un littéral de chaîne est interprété comme une chaîne d'octets.

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

Il y a deux exceptions: Vous pouvez définir un littéral Unicode (text) explicitement en préfixant le littéral avec u :

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

Vous pouvez également spécifier que les littéraux de chaîne d'un module entier doivent créer des littéraux Unicode (texte):

from __future__ import unicode_literals

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

Pour vérifier si votre variable est une chaîne (Unicode ou une chaîne d'octets), vous pouvez utiliser:

isinstance(s, basestring)
Python 3.x 3.0

Dans Python 3, le type str est un type de texte Unicode.

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

De plus, Python 3 a ajouté un objet bytes , adapté aux "blobs" binaires ou à l'écriture dans des fichiers indépendants du codage. Pour créer un objet octets, vous pouvez ajouter un préfixe b à un littéral de chaîne ou appeler la méthode d' encode la chaîne:

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

Pour tester si une valeur est une chaîne, utilisez:

isinstance(s, str)
Python 3.x 3.3

Il est également possible de préfixer des littéraux de chaîne avec un préfixe u pour faciliter la compatibilité entre les bases de code Python 2 et Python 3. Puisque, dans Python 3, toutes les chaînes sont Unicode par défaut, ajouter une chaîne à un littéral avec u n'a aucun effet:

u'Cafe' == 'Cafe'

Le préfixe de chaîne Unicode brut de Python 2, ur n'est pas supporté, cependant:

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

Notez que vous devez encode un objet text ( str ) Python 3 pour le convertir en une représentation en bytes de ce texte. Le codage par défaut de cette méthode est UTF-8 .

Vous pouvez utiliser le decode pour demander à un objet bytes quel texte Unicode il représente:

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

Bien que le type d' bytes existe à la fois dans Python 2 et 3, le type unicode n'existe que dans Python 2. Pour utiliser les chaînes Unicode implicites de Python 3 dans Python 2, ajoutez ce qui suit en haut de votre fichier de code:

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

Une autre différence importante est que l’indexation des octets dans Python 3 donne un résultat int comme celui-ci:

b"abc"[0] == 97

Alors que le découpage en taille de 1 donne un objet de longueur 1 octet:

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

En outre, Python 3 corrige certains comportements inhabituels avec Unicode, à savoir l'inversion des chaînes d'octets dans Python 2. Par exemple, le problème suivant est résolu:

# -*- 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