IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Python, de zéro


précédentsommairesuivant

VIII. L’encodage d’une chaîne

L’encodage est le nom donné à la façon de coder les caractères en binaire. Jusqu’à il y a une dizaine d’années, l’encoding habituel était le standard ASCII (nom officiel « latin‑1 ») qui utilise 7 bits et permet donc de coder 128 caractères (l’ASCII étendu utilise 8 bits et monte alors jusqu'à 256). Avec la popularisation de l’Internet et ses échanges d’informations entre différents pays, cet encoding s’est vite avéré insuffisant pour pouvoir coder tous les caractères des différents alphabets mondiaux (le Kanji, alphabet japonais, en contient par exemple plus de 6 000). Il a alors évolué en un codage plus général appelé Unicode. Et l’Unicode a dérivé vers l’utf qui est en fait un mélange ASCII/Unicode qui se résume, de façon simpliste, en « utiliser l’ASCII quand c’est possible sinon passer en Unicode ».

Python permet de créer une chaîne selon différents encodings. Cependant, les encodages par défaut ont changé entre Python 2 et Python 3.

VIII-1. La chaîne de base

La chaîne de base s’écrit de façon naturelle (encadrée de quotes simples ou doubles comme dans tous les exemples de chaînes vus jusqu’à présent). Dans Python 2, cette chaîne est encodée en ASCII. Dans Python 3, cette chaîne est encodée en Unicode. Dans les deux versions de Python, son type est nommé « str ».

 
Sélectionnez
1.
chaine="chaine de base"

VIII-2. Le préfixe « u »

Une chaîne préfixée par un caractère « u » (Unicode) est encodée en Unicode dans les deux Python. Dans Python 2, son type est nommé « Unicode » tandis que dans Python 3, son type est nommé « str ».

 
Sélectionnez
1.
chaine=u"chaine en Unicode"

VIII-3. Le préfixe « b »

Une chaîne préfixée par un caractère « b » (bytes) est encodée en ASCII dans les deux versions de Python. Dans Python 2, son type est nommé « str » tandis que dans Python 3, son type est nommé « bytes ».

 
Sélectionnez
1.
chaine=b"chaine en ASCII"

VIII-4. Le préfixe « r »

Une chaîne préfixée par un caractère « r » (raw) correspond à une chaîne de base (comme vu au début) toutefois, les caractères spéciaux (comme le backslash) ne sont pas interprétés comme caractères spéciaux, mais comme de simples caractères normaux.

 
Sélectionnez
1.
2.
chaine1="Ceci est une phrase\ncontenant deux lignes…"
chaine2=r"Ceci est un simple texte\nsur une seule ligne…"

VIII-5. Récapitulatifs

Pour résumer, une chaîne préfixée par « u » est toujours encodée en Unicode, aussi bien en Python 2 qu’en Python 3 ; et une chaîne préfixée par « b » est toujours encodée en ASCII, aussi bien en Python 2 qu’en Python 3. Mais dans ces deux cas, le nom du type n’est pas le même entre Python 2 (« Unicode ») et Python 3 (« str »).

Et une chaîne qui n’est pas préfixée, ou bien préfixée par « r », a le même nom de type (« str ») aussi bien en Python 2 qu’en Python 3 ; mais ce type « str » n’a pas le même encodage entre Python 2 (ASCII) et Python 3 (Unicode).

Syntaxe

Python 2

Python 3

Type

Encoding

Type

Encoding

chaine="bonjour"
chaine=r"bonjour"

str

ASCII

str

Unicode

chaine=u"bonjour"

Unicode

Unicode

str

Unicode

chaine=b"bonjour"

str

ASCII

bytes

ASCII

Le changement d’encodage des chaînes standards entre Python 2 et Python 3 est un des plus gros soucis de portabilité des scripts. Le développeur qui veut partir sur un code Python 2, mais qui prévoit de passer à moyenne échéance sur Python 3 a tout intérêt à utiliser dès le départ l’Unicode en préfixant systématiquement ses chaînes avec un « u ».

De plus, un autre souci peut provenir de toute communication entrante ou sortante avec des outils qui n'utilisent pas l'Unicode. Dans ce cas, il est préconisé de convertir les chaînes en provenance de l'outil en Unicode le plus tôt possible ; de travailler en interne Python en Unicode ; et de convertir les chaînes devant sortir vers l'outil dans l'encoding de l'outil le plus tard possible.

Attention : il ne faut pas confondre l’encoding du script, qui est le codage dans lequel le script est écrit, et qui est précisé avec la seconde ligne # coding: xxx ; et les chaînes manipulées dans le script. On peut très bien avoir un script écrit en ASCII et travaillant avec des chaînes Unicode.


précédentsommairesuivant

Copyright © 2022 Svear (svear@free.fr) Permission est accordée de copier, distribuer ou modifier ce document selon les termes de la « Licence de Documentation Libre GNU » (GNU Free Documentation License), version 1.1 ou toute version ultérieure publiée par la Free Software Foundation.