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 :

Formattage de chaînes avec des caractères accentués


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut Formattage de chaînes avec des caractères accentués
    Bonjour,
    Le script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/python 
    # -*- coding: utf-8 -*-  
    print '%-4s %-4s %-4s'%('a','b','c') 
    print '%-4s %-4s %-4s'%('â','b','c')
    Affiche dans ma console :
    On constate (essayez !) que l'accent sur le â crée un décalage
    - Comment expliquer ça ?
    - Comment réparer ça ?
    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 224
    Points
    224
    Par défaut
    Salut,
    Je ne sais pas trop à quoi c'est dû, mais je suppose que travailler sur des chaînes unicode réglera ce problème de décalage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> ch1 = u'%-4s %-4s %-4s'%(u'a',u'b',u'c')
    >>> ch2 = u'%-4s %-4s %-4s'%(u'â',u'b',u'c')
    >>> print ch1, '\n', ch2
    a    b    c    
    â    b    c

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Merci, ça fonctionne ... à moitié, et j'ai donc une autre question. J'écris le script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/python 
    # -*- coding: utf-8 -*-  
    print u'%-4s %-4s %-4s'%(u'a',u'b',u'c') 
    print u'%-4s %-4s %-4s'%(u'â',u'b',u'c')
    Je sauvegarde sous le nom test et je rends ce fichier exécutable. La commande :
    fonctionne très bien, j'obtiens comme prévu :
    Mais si j'enchaîne la commande test avec un autre programme, par exemple less, en faisant :
    ça plante, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "./test", line 5, in <module>
        print u'%-4s %-4s %-4s'%(u'â',u'b',u'c')
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe2' in position 0: ordinal not in range(128)
    a    b    c   
    (END)
    Merci pour toute aide.

    P.S.1 mon script du premier message s'enchainait bien avec d'autre commandes.
    P.S.2 j'espère que c'est un problème de Python, je n'en suis plus très sûr.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 224
    Points
    224
    Par défaut
    Salut,

    Le problème vient de l'encodage de sortie.
    Normalement, pour afficher une chaîne (d'autant plus si elle est unicode), il faut l'encoder avec la méthode encode(). Pour trouver l'encodage de sortie standard de la console, on peut utiliser sys.stdout.encoding.
    Seulement, lorsque la sortie du script est redirigée par un pipe, sys.stdout.encoding renvoie None.

    Le seul moyen à mon avis est alors de forcer l'encodage dans ce cas.
    Quelque chose de ce genre fonctionne bien chez moi, mais je ne sais pas s'il y a plus propre pour gérer le cas où sys.stdout.encoding renvoie None
    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
    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
     
    import sys
     
    # détection de l'encodage de sortie
    outencoding = sys.stdout.encoding
    if not outencoding:
        outencoding = 'UTF-8'
     
    ch1 = u'%-4s %-4s %-4s'%(u'a',u'b',u'c')
    ch2 = u'%-4s %-4s %-4s'%(u'â',u'b',u'c')
     
    print ch1.encode(outencoding)
    print ch2.encode(outencoding)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup valAa, ça marche
    Pour être franc, dans mon code d'origine, un peu moins simpliste que l'exemple que j'ai donné, j'avais essayé quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print('%-10s %-10s'%(s1.encode('utf-8'),s2.encode('utf-8')))
    et ça ne marchait pas, alors que ta solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(('%-10s %-10s'%(s1,s2)).encode('utf-8'))
    marche très bien. Seul l'ordre des choses a changé, c'est amusant : je suppose qu'il faut comprendre que le formattage avec des % "annule le encode".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Comment lire (ReadLine) un fichier XML avec des caractères accentués
    Par JFDAccess dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/01/2015, 07h37
  2. Réponses: 1
    Dernier message: 17/11/2013, 10h48
  3. Chiffrement RSA - Problème avec des caractères accentués
    Par HommeDeJava dans le forum Sécurité
    Réponses: 10
    Dernier message: 01/02/2012, 17h14
  4. [Upload] Nom de fichier avec un/des caractères accentués ?
    Par Christophe Charron dans le forum Langage
    Réponses: 11
    Dernier message: 09/06/2006, 21h46
  5. Chaînes avec des caractères accentués dans Interbase
    Par François Marliac dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/03/2004, 22h39

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