Encodage des caractères en Python

PythonBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous acquerrez une compréhension approfondie de l'encodage des caractères en Python. Nous commencerons par explorer l'histoire et les concepts fondamentaux de l'encodage des caractères, depuis les limitations des premiers encodages comme ASCII et les encodages ANSI spécifiques à chaque pays, jusqu'au développement et à l'importance de la norme Unicode et de ses diverses implémentations comme UTF-8. Vous apprendrez à vérifier l'encodage par défaut dans votre environnement Python.

En vous basant sur ces fondations, vous apprendrez des techniques pratiques pour travailler avec l'encodage des caractères en Python. Cela inclut l'utilisation des fonctions ord() et chr() pour convertir entre les caractères et leurs représentations entières, et la maîtrise des méthodes encode() et decode() pour convertir entre les chaînes de caractères (strings) et les octets (bytes). Enfin, vous apprendrez à gérer efficacement les erreurs d'encodage potentielles qui peuvent survenir lors du processus de décodage, garantissant un traitement de texte robuste et fiable dans vos applications Python.

Ceci est un Guided Lab, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour compléter chaque étape et acquérir une expérience pratique. Les données historiques montrent que c'est un laboratoire de niveau débutant avec un taux de réussite de 88%. Il a reçu un taux d'avis positifs de 98% de la part des apprenants.

Explorer l'historique et les concepts de l'encodage des caractères

Dans cette étape, nous allons explorer l'histoire et les concepts fondamentaux de l'encodage des caractères. Comprendre comment les ordinateurs représentent le texte est crucial pour travailler avec divers formats de données et langues.

Initialement, les ordinateurs ont été développés aux États-Unis, ce qui a conduit à la création de l'encodage ASCII. ASCII utilise un seul octet pour représenter les caractères et inclut les lettres anglaises, les chiffres et les symboles, soit un total de 128 caractères.

Alors que les ordinateurs se répandaient davantage à l'échelle mondiale, ASCII s'est avéré insuffisant pour représenter les caractères d'autres langues. Cela a conduit au développement de divers encodages spécifiques à chaque pays, tels que GB2312, GBK, Big5 et Shift_JIS. Ceux-ci étaient souvent désignés collectivement sous le nom d'encodages ANSI.

Pour remédier aux limitations de ces encodages disparates, la norme Unicode a été développée. Unicode vise à fournir un code binaire unique pour chaque caractère de chaque langue, permettant une gestion cohérente du texte sur différentes plateformes et langues. Unicode définit les codes de caractères mais pas la manière dont ils sont stockés.

Plusieurs schémas d'encodage implémentent Unicode, notamment UCS4, UTF-8, UTF-16 et UTF-32. Parmi ceux-ci, UTF-8 est largement utilisé en raison de sa rétrocompatibilité avec ASCII.

Dans Python 3, l'encodage par défaut est UTF-8, ce qui permet l'utilisation directe de caractères de diverses langues, y compris les caractères accentués et les symboles. Dans les versions plus anciennes comme Python 2, vous deviez généralement spécifier l'encodage au début de votre script en utilisant des commentaires comme ## -*- coding: UTF-8 -*- ou ## coding=utf-8.

Vous pouvez vérifier l'encodage par défaut dans votre environnement Python en utilisant le module sys.

Tout d'abord, ouvrez le terminal intégré dans le WebIDE en cliquant sur Terminal -> New Terminal.

Ensuite, démarrez l'interpréteur interactif Python en tapant python et en appuyant sur Entrée.

python

Vous devriez voir une sortie similaire à celle-ci :

Python 3.10.x (main, ...)
[GCC ...] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Maintenant, importez le module sys et vérifiez l'encodage par défaut :

import sys
sys.getdefaultencoding()

La sortie affichera l'encodage par défaut, qui est généralement utf-8 dans Python 3.

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>

Quittez l'interpréteur Python en tapant exit() et en appuyant sur Entrée.

exit()

Utiliser ord() et chr() pour convertir les caractères et les entiers

Dans cette étape, nous allons apprendre à utiliser les fonctions intégrées de Python ord() et chr() pour convertir entre les caractères et leurs représentations entières correspondantes en Unicode.

Dans Python 3, les chaînes de caractères (strings) sont représentées en utilisant Unicode. La fonction ord() prend un seul caractère en entrée et retourne sa valeur entière décimale Unicode correspondante.

Créons un nouveau fichier Python pour expérimenter ces fonctions. Dans l'explorateur de fichiers du WebIDE, faites un clic droit sur le répertoire project et sélectionnez New File. Nommez le fichier char_conversion.py.

Ouvrez char_conversion.py dans l'éditeur et ajoutez le code suivant :

## Utiliser ord() pour obtenir la valeur décimale Unicode des caractères
char1 = 'a'
char2 = 'é'
char3 = ';'

print(f"La valeur décimale Unicode de '{char1}' est : {ord(char1)}")
print(f"La valeur décimale Unicode de '{char2}' est : {ord(char2)}")
print(f"La valeur décimale Unicode de '{char3}' est : {ord(char3)}")

Enregistrez le fichier en appuyant sur Ctrl + S (ou Cmd + S sur macOS).

Maintenant, ouvrez à nouveau le terminal intégré (s'il n'est pas déjà ouvert) et exécutez le script en utilisant la commande python :

python char_conversion.py

Vous devriez voir une sortie similaire à celle-ci :

La valeur décimale Unicode de 'a' est : 97
La valeur décimale Unicode de 'é' est : 233
La valeur décimale Unicode de ';' est : 59

La fonction chr() effectue l'opération inverse. Elle prend un entier décimal (ou un entier hexadécimal) représentant un point de code Unicode et retourne le caractère correspondant.

Ajoutons plus de code à char_conversion.py pour utiliser la fonction chr(). Ajoutez les lignes suivantes au code existant :

## Utiliser chr() pour obtenir le caractère à partir d'une valeur décimale Unicode
int1 = 8364
int2 = 8482

print(f"Le caractère pour la valeur décimale Unicode {int1} est : {chr(int1)}")
print(f"Le caractère pour la valeur décimale Unicode {int2} est : {chr(int2)}")

## Vous pouvez également utiliser des valeurs hexadécimales avec chr()
hex_int = 0x00A9 ## Hexadécimal pour le caractère '©'
print(f"Le caractère pour la valeur hexadécimale Unicode {hex(hex_int)} est : {chr(hex_int)}")

Enregistrez à nouveau le fichier.

Exécutez le script depuis le terminal :

python char_conversion.py

La sortie devrait maintenant inclure les résultats de la fonction chr() :

La valeur décimale Unicode de 'a' est : 97
La valeur décimale Unicode de 'é' est : 233
La valeur décimale Unicode de ';' est : 59
Le caractère pour la valeur décimale Unicode 8364 est : €
Le caractère pour la valeur décimale Unicode 8482 est : ™
Le caractère pour la valeur hexadécimale Unicode 0xa9 est : ©

Vous vous demandez peut-être comment trouver la représentation Unicode hexadécimale d'un caractère. Vous pouvez utiliser la fonction ord() pour obtenir la valeur décimale, puis la fonction intégrée hex() pour convertir la valeur décimale en sa représentation sous forme de chaîne hexadécimale.

Ajoutez le code suivant à char_conversion.py :

## Convertir un caractère en sa représentation Unicode hexadécimale
char_copyright = '©'
decimal_copyright = ord(char_copyright)
hexadecimal_copyright = hex(decimal_copyright)

print(f"La valeur Unicode hexadécimale de '{char_copyright}' est : {hexadecimal_copyright}")

Enregistrez le fichier et exécutez-le une dernière fois :

python char_conversion.py

La sortie finale inclura la valeur hexadécimale du caractère '©' :

La valeur décimale Unicode de 'a' est : 97
La valeur décimale Unicode de 'é' est : 233
La valeur décimale Unicode de ';' est : 59
Le caractère pour la valeur décimale Unicode 8364 est : €
Le caractère pour la valeur décimale Unicode 8482 est : ™
Le caractère pour la valeur hexadécimale Unicode 0xa9 est : ©
La valeur Unicode hexadécimale de '©' est : 0xa9

Cela démontre comment ord(), chr() et hex() peuvent être utilisés ensemble pour travailler avec les encodages de caractères en Python.

Convertir entre chaînes de caractères et octets avec encode() et decode()

Dans cette étape, nous allons apprendre à convertir entre les chaînes de caractères Python (qui sont Unicode) et les objets bytes en utilisant les méthodes encode() et decode(). Ceci est essentiel lorsque l'on traite des données qui doivent être transmises ou stockées dans un format d'encodage spécifique.

La méthode encode() est utilisée pour convertir une chaîne de caractères en un objet bytes en utilisant un encodage spécifié. Elle retourne un objet bytes.

Créons un nouveau fichier Python nommé encoding_decoding.py dans le répertoire ~/project.

Ouvrez encoding_decoding.py dans l'éditeur et ajoutez le code suivant :

## Définir une chaîne de caractères
my_string = 'café'

## Encoder la chaîne en utilisant UTF-8
encoded_utf8 = my_string.encode('utf-8')

## Encoder la chaîne en utilisant Latin-1
encoded_latin1 = my_string.encode('latin-1')

## Afficher les objets bytes encodés
print(f"Chaîne originale : {my_string}")
print(f"Encodé en UTF-8 : {encoded_utf8}")
print(f"Encodé en Latin-1 : {encoded_latin1}")

Enregistrez le fichier.

Maintenant, exécutez le script depuis le terminal intégré :

python encoding_decoding.py

Vous devriez voir une sortie montrant la chaîne originale et sa représentation en octets en UTF-8 et en Latin-1 :

Chaîne originale : café
Encodé en UTF-8 : b'caf\xc3\xa9'
Encodé en Latin-1 : b'caf\xe9'

Notez que la sortie des objets bytes commence par b', indiquant qu'il s'agit de littéraux d'octets. Les nombres hexadécimaux représentent les séquences d'octets de la chaîne dans chaque encodage.

La méthode decode() est utilisée pour reconvertir un objet bytes en une chaîne de caractères en utilisant un encodage spécifié.

Ajoutons du code à encoding_decoding.py pour décoder les objets bytes que nous avons créés. Ajoutez les lignes suivantes au code existant :

## Décoder les objets bytes pour les reconvertir en chaînes de caractères
decoded_utf8 = encoded_utf8.decode('utf-8')
decoded_latin1 = encoded_latin1.decode('latin-1')

## Afficher les chaînes décodées
print(f"Décodé depuis UTF-8 : {decoded_utf8}")
print(f"Décodé depuis Latin-1 : {decoded_latin1}")

Enregistrez le fichier.

Exécutez à nouveau le script :

python encoding_decoding.py

La sortie affichera maintenant la chaîne originale décodée avec succès à partir des octets UTF-8 et Latin-1 :

Chaîne originale : café
Encodé en UTF-8 : b'caf\xc3\xa9'
Encodé en Latin-1 : b'caf\xe9'
Décodé depuis UTF-8 : café
Décodé depuis Latin-1 : café

Cela démontre le processus de base d'encodage d'une chaîne de caractères en octets et de décodage des octets en une chaîne de caractères en utilisant des encodages spécifiques. Il est crucial d'utiliser le bon encodage pour l'encodage et le décodage afin d'éviter les erreurs, ce que nous explorerons dans la prochaine étape.

Gérer les erreurs d'encodage lors du décodage

Dans cette étape, nous allons explorer ce qui se passe lorsque vous essayez de décoder des octets en utilisant le mauvais encodage et comment gérer de telles erreurs.

Comme nous l'avons vu à l'étape précédente, pour décoder avec succès des octets, il faut connaître l'encodage d'origine utilisé pour créer ces octets. Si vous tentez de décoder des octets avec un encodage incompatible, Python lèvera une erreur.

Modifions notre fichier encoding_decoding.py pour illustrer cela. Ouvrez le fichier dans l'éditeur et ajoutez le code suivant à la fin :

## Tenter de décoder des octets encodés en Latin-1 en utilisant ASCII
try:
    decoded_incorrectly = encoded_latin1.decode('ascii')
    print(f"Décodé de Latin-1 en utilisant ASCII : {decoded_incorrectly}")
except UnicodeDecodeError as e:
    print(f"Erreur lors du décodage de Latin-1 avec ASCII : {e}")

Enregistrez le fichier.

Exécutez le script depuis le terminal :

python encoding_decoding.py

La sortie inclura maintenant le message d'erreur lors de la tentative de décodage des octets Latin-1 avec ASCII :

Chaîne originale : café
Encodé en UTF-8 : b'caf\xc3\xa9'
Encodé en Latin-1 : b'caf\xe9'
Décodé depuis UTF-8 : café
Décodé depuis Latin-1 : café
Erreur lors du décodage de Latin-1 avec ASCII : 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)

L'UnicodeDecodeError indique que le codec ASCII a rencontré des octets qui ne sont pas valides selon la norme ASCII. Dans ce cas, l'octet 0xe9 est la représentation Latin-1 de 'é', mais ce n'est pas un caractère ASCII valide (ASCII ne couvre que les caractères de 0 à 127).

Lors du décodage, vous pouvez également spécifier comment gérer les erreurs en utilisant le paramètre errors de la méthode decode(). Les stratégies courantes de gestion des erreurs incluent :

  • 'strict' (par défaut) : Lève une UnicodeDecodeError.
  • 'ignore' : Ignore les octets indéchiffrables.
  • 'replace' : Remplace les octets indéchiffrables par un caractère de remplacement (généralement ``).
  • 'xmlcharrefreplace' : Remplace les octets indéchiffrables par des références de caractères XML.

Ajoutons des exemples d'utilisation des stratégies de gestion d'erreurs 'ignore' et 'replace' à encoding_decoding.py. Ajoutez le code suivant :

## Tenter de décoder des octets encodés en Latin-1 en utilisant ASCII avec gestion des erreurs
decoded_ignore = encoded_latin1.decode('ascii', errors='ignore')
decoded_replace = encoded_latin1.decode('ascii', errors='replace')

print(f"Décodé de Latin-1 en utilisant ASCII (ignorer les erreurs) : {decoded_ignore}")
print(f"Décodé de Latin-1 en utilisant ASCII (remplacer les erreurs) : {decoded_replace}")

Enregistrez le fichier.

Exécutez à nouveau le script :

python encoding_decoding.py

La sortie affichera maintenant les résultats avec la gestion des erreurs :

Chaîne originale : café
Encodé en UTF-8 : b'caf\xc3\xa9'
Encodé en Latin-1 : b'caf\xe9'
Décodé depuis UTF-8 : café
Décodé depuis Latin-1 : café
Erreur lors du décodage de Latin-1 avec ASCII : 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)
Décodé de Latin-1 en utilisant ASCII (ignorer les erreurs) : caf
Décodé de Latin-1 en utilisant ASCII (remplacer les erreurs) : caf

Comme vous pouvez le voir, 'ignore' donne "caf" car l'octet invalide a été ignoré, supprimant le caractère 'é'. 'replace' remplace l'octet invalide par le caractère de remplacement ``, résultant en "caf".

Le choix de la stratégie de gestion des erreurs appropriée dépend de vos besoins spécifiques. Dans la plupart des cas, il est préférable d'utiliser 'strict' pendant le développement pour détecter les problèmes d'encodage tôt. En production, vous pourriez choisir 'replace' ou 'ignore' si vous avez besoin de traiter des données avec des problèmes d'encodage potentiels, mais sachez que cela peut entraîner une perte ou une corruption de données.

Résumé

Dans ce laboratoire, nous avons exploré l'histoire et les concepts fondamentaux de l'encodage des caractères, en commençant par ASCII et ses limitations, qui ont conduit au développement de divers encodages spécifiques à chaque pays et finalement à la norme Unicode. Nous avons appris qu'Unicode fournit un code unique pour chaque caractère et qu'il est implémenté par divers schémas d'encodage comme UTF-8, qui est le défaut dans Python 3 et est rétrocompatible avec ASCII. Nous avons également appris à vérifier l'encodage par défaut en Python en utilisant le module sys.

Nous avons ensuite pratiqué la conversion entre les caractères et leurs représentations entières à l'aide des fonctions ord() et chr(), et entre les chaînes de caractères et les octets à l'aide des méthodes encode() et decode(). Enfin, nous avons abordé la manière de gérer les erreurs d'encodage potentielles qui peuvent survenir lors du processus de décodage.