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 :

yet another problème d'encodage !


Sujet :

Python

  1. #1
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut yet another problème d'encodage !
    Dé-zo-lé !
    On dirait que tout le monde s'est donné le mot pour poser des problèmes liés à l'encodage des caractères !
    J'en rajoute une couche...

    Mon problème est d'afficher une url (avec des caractères compliqués) sur la console.

    Après avoir parcouru tous les posts déjà présents, j'ai trouvé une astuce qui marche plutôt bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import urllib
    url = 'www.%C3%A9h%C3%A8.com'
    print unicode( urllib.unquote_plus( url ),'UTF8')
    Ça marche impec : j'ai bien "www.éhè.com" qui s'affiche.
    Mais voilà, avec des caractère vraiment spéciaux, ça ne marche plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import urllib
    url = '__%cc%aa__'
    print unicode( urllib.unquote_plus( url ),'UTF8','ignore' )
    --> UnicodeEncodeError: 'charmap' codec can't encode character u'\u032a' in position 2: character maps to <undefined>

    Ce code ccaa qui correspond à \u032A (COMBINING BRIDGE BELOW) fait tout planter, même en ajoutant 'ignore' en paramètre à unicode .

    Que faire... je comprends bien que tous les caractères du monde ne puissent pas s'afficher sur une console, mais comment dire à Python de les ignorer si 'ignore' ne marche pas ?
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je n'ai pas d'erreur avec ton dernier code. J'ai vérifié avant que ton caractère existait bien ici: http://hapax.qc.ca/conversion.fr.html.

    Celà donne:

    __̪__
    Je suppose donc que c'est ta console d'affichage qui ne supporte pas ce caractère. Et comme c'est le print qui déclenche l'encodage défaillant, ce n'est pas ton replace qui ne marche pas! A mon avis, seule une console utf-8 peut accepter ça. Et dans une console non-utf-8, il faudrait ajouter un encodage explicite pour la console, et là, son replace sera exploité.

    Tyrtamos

    Edit: et curieusement, le caractère que je cite ci-dessus est correctement restitué sur Firefox (3.5.5), mais pas sur Internet Explorer (8.0) ???
    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 habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    Merci tyrtamos !
    Avec ce code là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # -*- coding: latin-1 -*-
     
    def trace ( *vars ):
        import sys
        def encode( c ) :
            return unicode( c,'latin-1' ).encode( sys.stdout.encoding,'replace' )
        print ''.join( encode( v ) for v in vars )
     
    import urllib
    trace( urllib.unquote_plus( '(%cc%aa)' ),' + éà瀲µ¤ù§' )
    j'obtiens ça :
    "(̪) + éàç?²µ¤ù§"
    Le caractère %cc%aa donne un truc bizarre, mais ça ne me gène pas plus que ça.
    Ce qui me gène, c'est que le caractère soit remplacé par un '?'.
    Comment se fait-il que ma console l'accepte (il me suffit de taper € et il s'affiche) mais que la conversion par python le remplace ?

    PS : je suis sous XP et ma console est 4NT (page cp850).
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Oui, c'est curieux.

    En fait, Python a raison de ne pas accepter le signe euro, parce qu'il n'existe pas dans le code page cp850 de la console DOS (=> http://en.wikipedia.org/wiki/Code_page_850). Il est donc remplacé par '?' comme prévu avec l'option 'replace'.

    Mais bizarrement, on peut introduire ce signe en tapant directement un '€' dans la console. Je pense que c'est dû au fait que la police utilisée dans la console (j'utilise la police "lucida console") est en fait une police unicode qui contient le signe euro (U+20AC). On peut le vérifier facilement en accédant à la table des caractères de Windows (Menu: Tous les programmes -> accessoires -> outils système -> Table des caractères).

    En résumé, pour afficher un caractère dans une console, il faut que l'encodage de la console le permette, ce qui est le cas à coup sûr pour une console utf-8 et à vérifier pour toutes les autres.

    [A part cela, évite dans ton code de donner le nom "encode" à une fonction: c'est déjà un nom utilisé par Python.]

    Tyrtamos
    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

  5. #5
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    OK, merci beaucoup !

    En fait, c'est assez bizarre : quand je demande la page active (commande chcp) il me dit 850 mais si je fait afficher les caractères de 128 à 255, je trouve les caractères latin-1 et non ceux de cp850...
    Et le caractère € se trouve en 8364, càd son code en UTF8...
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

Discussions similaires

  1. [CSV] Problème d'encodage
    Par simoryl dans le forum Langage
    Réponses: 13
    Dernier message: 18/04/2012, 15h20
  2. [XSLT 1.0]Yet another Problème de filtrage Dynamique
    Par pradator dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/05/2007, 09h24
  3. Problème d'encodage en Unicode
    Par Skreo dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 28/12/2005, 10h43
  4. Problème d'encodage sur MySql 4.1
    Par Blanchet dans le forum Outils
    Réponses: 1
    Dernier message: 04/12/2005, 04h53
  5. [XML::PARSER] Problème d'encodage
    Par frangin2003 dans le forum Modules
    Réponses: 13
    Dernier message: 05/09/2005, 14h59

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