Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
encodage [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


encodage

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
encodage [2009/08/17 08:17]
tyrtamos
encodage [2009/08/17 09:13]
tyrtamos
Ligne 37: Ligne 37:
 Pour les autres pays ayant des caractères non latins, il existe d'autres codages de caractères comme l'iso-8859-5 pour l'alphabet cyrillique, l'iso-8859-7 pour l'alphabet grec moderne, etc...  Pour les autres pays ayant des caractères non latins, il existe d'autres codages de caractères comme l'iso-8859-5 pour l'alphabet cyrillique, l'iso-8859-7 pour l'alphabet grec moderne, etc... 
  
-Mais maintenant, comment faire pour que les même programmes puissent, sans changer de codage de caractères, être utilisés en Grèce, en Inde, en Russie, en Chine, etc... Ceci d'autant plus qu'avec Internet, les échanges sont devenus quotidiens, et rien ne doit vous empêcher de converser par mail avec des chinois ou des russes. La multiplicité des caractères exclut qu'on reste à l'intérieur des octets (0 à 255): alors, comment on fait? **On invente l'UNICODE!** Voir [[http://fr.wikipedia.org/wiki/Unicode]].+\\ 
 +Mais maintenant, comment faire pour que les même programmes puissent, sans changer d'encodage de caractères, être utilisés en Grèce, en Inde, en Russie, en Chine, etc... Ceci d'autant plus qu'avec Internet, les échanges sont devenus quotidiens, et rien ne doit vous empêcher de converser par mail avec des chinois ou des russes. La multiplicité des caractères exclut qu'on reste à l'intérieur des octets (0 à 255): alors, comment on fait? **On invente l'UNICODE!** Voir [[http://fr.wikipedia.org/wiki/Unicode]].
  
 Il y a en fait plusieurs types d'unicode: UCS-2, UTF-8, UTF-16, UTF-32, ... Il y a en fait plusieurs types d'unicode: UCS-2, UTF-8, UTF-16, UTF-32, ...
Ligne 43: Ligne 44:
 En simplifiant, pour nous, français utilisant Python: En simplifiant, pour nous, français utilisant Python:
  
-  * **UCS-2** est l'unicode utilisé en interne par Python. Il est proche de l'UTF-16.+  * **UCS-2** est l'Unicode utilisé en interne par Python. Il est proche de l'UTF-16.
   * **UTF-8** utilise de 1 à 4 octets par caractère. L'avantage est que les caractères codés en 1 seul octet de 0 à 127 sont sensiblement les mêmes que dans l'ASCII.    * **UTF-8** utilise de 1 à 4 octets par caractère. L'avantage est que les caractères codés en 1 seul octet de 0 à 127 sont sensiblement les mêmes que dans l'ASCII. 
   * **UTF-16** utilise 2 octets par caractères (plus si nécessaire pour des cas spéciaux et rares)   * **UTF-16** utilise 2 octets par caractères (plus si nécessaire pour des cas spéciaux et rares)
Ligne 49: Ligne 50:
 ===== Généralités sur l'encodage des caractères dans Python ===== ===== Généralités sur l'encodage des caractères dans Python =====
  
 +Avec Python 2.6, on peut toujours travailler avec des codages sur un octets, par exemple avec l'iso-8859-1, mais on va de plus en plus travailler en Unicode. Et ceci, surtout si on travaille en multiplateforme et en multilingue. En ce qui me concerne, comme je fais du développement windows-linux, je suis obligé de travailler le plus souvent en utf-8 qui est l'encodage par défaut des linux modernes. 
  
 +Les codages utilisables par Python sont ici: [[http://docs.python.org/library/codecs.html#standard-encodings]]
  
 +\\
 +Si on veut travailler en Unicode avec Python, voici quelques principes simples à respecter:
  
 +  * Dans les traitements, on travaille uniquement en Unicode interne (qui n'est ni l'utf-8 ni l'utf-16!)
  
 +  * On convertit le plus tôt possible tout ce qui rentre: saisie, code source, lecture d'un fichier de données ou d'une base de données, réception d'un réseau, etc...
 +
 +  * On convertit le plus tard possible tout ce qui sort (affichage, impression, écriture dans un fichier de données ou dans une base de données, émission vers un réseau, etc...
 +
 +\\
 +Remarques:
 +
 +  * au fil des dernières versions de Python, il est de plus en plus facile de travailler en Unicode, mais ce n'est encore pas parfait. Par exemple, je ne suis pas sûr que tous les modules Python, et surtout les modules tiers, supportent l'Unicode (il faut vérifier dans le manuel ou dans le code source du module). En tout cas, il ne faut pas utiliser le module string qui est obsolète.
 +
 +  * la nécessité de convertir en entrée et en sortie suppose que vous avez connaissance des encodages utilisés dans les données externes! Ce n'est pas le plus simple. 
 +
 +\\
 +Pour reproduire les tests ci-dessous, je vous suggère de vous munir de 3 outils supplémentaires:
 +
 +  * un éditeur de texte sachant enregistrer sous différents encodages, y compris l'utf-8 (pour Windows, le bloc-note "notepad" fait cela).
 +
 +  * un éditeur hexadécimal permettant de lire des fichiers (ça existe sous Windows et sous Linux)
 +
 +  * une table des caractères (ça existe sous Windows et sous Linux)
  
 ===== Entrée/Traitement/sortie de chaines de caractères ===== ===== Entrée/Traitement/sortie de chaines de caractères =====
encodage.txt · Dernière modification: 2009/08/31 23:20 de tyrtamos