IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème d'encodage utf-8/iso-8859-15


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Problème d'encodage utf-8/iso-8859-15
    Bonjour,
    J'ai un problème d'encodage (Python 2.6.6): j'ai un fichier texte où les données sont enregistrées en iso-8859-15 (sous windows) contenant une unique ligne :
    Mon script est sous Linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/usr/bin/env python
    # -*- coding: iso-8859-15 -*-
     
    import codecs
     
    if __name__ == '__main__':
    	fichierTextWin = codecs.open('fichierTextWin.txt', 'r', 'iso-8859-15')
    	lignes = fichierTextWin.readlines()
    	print(lignes)
    	for ligne in lignes:
    		print ligne
    		if '\xe9\n' == ligne:
    			print("1 - ça marche")
    		else:
    			print("1 - ça ne marche pas")
    		if 'é' == ligne:
    			print("2 - ça marche")
    		else:
    			print("2 - ça ne marche pas")
    		if u'é' == ligne:
    			print("3 - ça marche")
    		else:
    			print("3 - ça ne marche pas")
    et ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [u'\xe9\r\n']
     
    test_UTF-8_Linux.py:16: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
      if '\xe9\n' == ligne:
    1 - ça ne marche pas
    test_UTF-8_Linux.py:20: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
      if 'é' == ligne:
    2 - ça ne marche pas
    3 - ça ne marche pas
    J'ai essayé dans l'autre sens: en enregistrant le fichier texte en utf-8 cette fois ci et là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import codecs
     
    if __name__ == '__main__':
    	fichierTextWin = codecs.open('fichierTextWin.txt', 'r', 'utf-8')
    	lignes = fichierTextWin.readlines()
    	print(lignes)
    	for ligne in lignes:
    		print ligne
    		if u'\xe9\n' == ligne:
    			print("1 - ça marche")
    		else:
    			print("1 - ça ne marche pas")
    		if u'é' == ligne:
    			print("2 - ça marche")
    		else:
    			print("2 - ça ne marche pas")
    ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1 - ça marche
    2 - ça ne marche pas
    Comment faire pour faire une conversion correcte sans avoir à écrire d'hexa ?
    Merci d'avance !!

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quelques règles simples vont te permettre de sortir de ton problème.

    1- la ligne du haut de la page de code "# -*- coding: iso-8859-15 -*-" dit à l'interpréteur Python comment sont encodées les chaines de caractères "codées en dur" dans la page (genre x = "é"). Cela ne veut absolument pas dire que Python devra travailler en "iso-8859-15"! Et quand on écrit x = u"é", Python convertit en unicode le "é" de la page, initialement en "iso-8859-15".

    NB: si on met une telle ligne en haut de page, il est impératif que l'éditeur de texte utilisé édite et enregistre avec cet encodage, sinon, ça donne n'importe quoi. En cas de doute, il est intéressant de vérifier directement le fichier avec un éditeur hexa.

    2- Avec Python 2.x, il faut travailler le plus possible en unicode, c'est à dire convertir le plus vite possible les données qui rentrent, et le plus tard possible le données qui sortent. Pour les données à échanger avec le disque, le module 'codecs' est très bon. Avec les autres entrées-sorties, il faut utiliser x.decode('iso-8859-15') pour convertir en unicode un 'x' initialement en 'iso-8859-15', et x.encode('iso-8859-15') pour convertir en 'iso-8859-15' un 'x' initialement en unicode.

    Voilà des exemples concrets:

    - créer un fichier texte comportant un "é" + fin de ligne, encodé 'iso-8859-15':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import codecs
     
    nf = "test.txt"
    x = u"é" # x est en unicode
    with codecs.open(nf, 'w', 'iso-8859-15') as f:
        f.write(x + "\n")
    - lire le contenu de ce fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with codecs.open(nf, 'r', 'iso-8859-15') as f:
        ch = f.readline().rstrip() # rstrip supprime la fin de ligne
        # ch est en unicode
     
    print ch, ch==u"é"
    é True
    3- ne pas oublier que la console d'affichage a elle aussi un encodage: il faut quelquefois convertir le chaine pour qu'elle s'affiche correctement. Cependant, de plus en plus acceptent l'affichage correct des chaines en unicode.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Tyrtamos, je lis toujours tes postes sur l'encodage et celui-ci vient m'éclairer.
    Il est vrai que je me demandais de quel encodage était question cette ligne :
    "# -*- coding: iso-8859-15 -*-".
    Dans mon esprit cela était flou entre les sorties fichiers, les variables texte, le codage du script dans l'éditeur.

    Donc merci

    Alex

Discussions similaires

  1. [FPDF] Encodage UTF-8
    Par navis84 dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 08/09/2018, 12h43
  2. [DOM] Problème d'encodage UTF-8
    Par Valter dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 14/05/2008, 15h32
  3. Problème d'encodage UTF-8
    Par Shugo78 dans le forum Ubuntu
    Réponses: 0
    Dernier message: 23/11/2007, 19h40
  4. [MySQL] Problème d'encodage UTF-8
    Par cloridriks dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/10/2007, 11h19
  5. Encodage UTF8 et ISO-8859-1
    Par Shuny dans le forum Outils
    Réponses: 2
    Dernier message: 19/06/2007, 00h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo