ProgrammationDéveloppeur Backend

Qu'est-ce que l'encodage et le décodage des données en Python, pourquoi sont-ils nécessaires et comment les utiliser correctement lors du travail avec des chaînes et des octets ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historique de la question:

L'encodage (encoding) et le décodage (decoding) des données sont devenus pertinents avec la nécessité d'échanger des informations entre des dispositifs, des programmes et des plateformes qui peuvent interpréter les caractères et leur représentation en mémoire de manière différente. En Python, cette tâche est devenue critique en raison de la stricte séparation entre les chaînes (str) et les octets (bytes), à partir de Python 3.x, où les chaînes sont des séquences de caractères Unicode et les octets sont des séquences d'octets.

Problème:

En travaillant avec des fichiers, des réseaux et des systèmes externes, il est souvent nécessaire de convertir des données entre des représentations d'octets et des chaînes. Une utilisation incorrecte des encodages peut entraîner des erreurs UnicodeEncodeError et UnicodeDecodeError, des violations de l'intégrité des données et des problèmes de prise en charge de différentes langues.

Solution:

En Python, pour convertir une chaîne en octets, on utilise la méthode .encode(), et pour la conversion inverse — .decode(). L'encodage le plus courant est "utf-8":

text = "Привет, мир!" encoded = text.encode('utf-8') # Encode la chaîne en bytes print(encoded) # b'\xd0\x9f\xd1\x80...' decoded = encoded.decode('utf-8') # Décode à nouveau en chaîne print(decoded) # 'Привет, мир!'

Caractéristiques clés :

  • Python 3 sépare strictement les chaînes (str) et les octets (bytes) — il n'est pas possible de les mélanger directement dans les expressions et il faut toujours indiquer explicitement l'encodage.
  • Il est recommandé d'indiquer toujours l'encodage lors de la lecture et de l'écriture de fichiers (par exemple, open(..., encoding='utf-8')).
  • Tous les données binaires ne peuvent pas être décodées avec n'importe quel encodage — pour les fichiers binaires (par exemple, les images), le décodage n'est pas appliqué.

Questions piégeantes.

Que se passe-t-il si l'on essaie de décoder une chaîne d'octets avec un encodage incorrect ?

Lors de l'essai de décoder des octets à l'aide d'un encodage incorrect, une erreur se produira ou un texte incorrect sera obtenu. Par exemple :

b = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' wrong = b.decode('latin-1') print(wrong) # Affichera de l'abra-cadabra, et non "Привет"

Peut-on combiner une chaîne et une chaîne d'octets directement avec + ?

Non. Cela déclenchera une exception TypeError.

s = "abc" b = b"def" # s + b # TypeError: can only concatenate str (not "bytes") to str

Peut-on écrire un fichier texte sans indiquer explicitement l'encodage ?

Oui, mais cela est considéré comme une mauvaise pratique, car cela utilise l'encodage système par défaut, qui dépend des paramètres du système d'exploitation, ce qui entraîne une incompatibilité entre les plateformes.

Erreurs typiques et anti-modèles

  • Ne pas indiquer l'encodage lors de la lecture/écriture de fichiers.
  • Essayer de décoder des octets qui ne sont pas du texte.
  • Confondre str et bytes, sans effectuer de conversion explicite.

Exemple de la vie réelle

Cas négatif

Un programmeur écrit un fichier de log sous Windows sans indiquer l'encodage. Le log s'ouvre sur Linux ou Mac, mais affiche de l'abra-cadabra au lieu de caractères cyrilliques.

Avantages :

  • Le code est plus court.

Inconvénients :

  • Incompatibilité entre plateformes.
  • Les données peuvent être perdues.
  • Des erreurs d'incompatibilité d'encodage apparaissent.

Cas positif

Un programmeur indique toujours encoding='utf-8' lors du travail avec des fichiers :

with open('log.txt', 'w', encoding='utf-8') as f: f.write('Программа завершилась успешно')

Avantages :

  • Compatibilité entre systèmes d'exploitation.
  • Fonctionnement correct avec n'importe quelle langue.

Inconvénients :

  • Il faut se souvenir de la nécessité d'indiquer l'encodage.