{{tag>dev python charset caracteres encodage encoding}}
====== Jeux de caractères et encodage avec python ======
Le PEP 263 détaille les problématiques liées à l'encodage de caractères en Python et la directive **coding**.
===== Encodage par défaut =====
Il est possible de récupérer l'encodage par défaut utilisé par le système courant via le module **sys**:
import sys
sys.getdefaultencoding()
===== Erreur à l’exécution d'un script utf-8 sous Windows =====
Le script s’exécute normalement sous Linux mais affiche une erreur à l’exécution sous Windows. Cela peut se produire si les deux systèmes n'utilisent pas le même jeu de caractère par défaut et que le jeu de caractère n'a pas été précisé via la directive **coding** en début de fichier:
python mon_script.py
File "mon_script.py", line 2
SyntaxError: encoding problem: utf8
Vérifier bien la syntaxe du header, il doit utiliser une des deux formes suivantes:
#!/usr/bin/env python
# coding: utf-8
ou bien
#!/usr/bin/env python
# -*- coding: utf-8 -*-
Lorsque les scripts utilise l'entête
===== Erreur =====
Lors de l’exécution du script python utilisant en entrée un fichier texte, un message de la forme suivante est retournée par interpréteur:
UnicodeEncodeError: 'charmap' codec can't encode character '\ufeff' in position 54: character maps to
Le caractère u'\ufeff ' est le BOM((**B**yte **O**rder **M**ark)). Utiliser la syntaxe suivante à l'ouverture du fichier:
with open("data/file.txt", "r", encoding='utf-8-sig') as fp:
===== Références =====
* https://docs.python.org/3/reference/lexical_analysis.html#encoding-declarations
* http://sebsauvage.net/python/charsets_et_encoding.html
* https://stackoverflow.com/questions/6289474/working-with-utf-8-encoding-in-python-source#6289494
* https://code-examples.net/en/q/11151f3