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 :
open(..., encoding='utf-8')).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.
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 :
Inconvénients :
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 :
Inconvénients :