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

Bibliothèques tierces Python Discussion :

[encodage] Unicode ne sait pas lire unicode...


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre du Club Avatar de Mr Hyde
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 62
    Points
    62
    Par défaut [encodage] Unicode ne sait pas lire unicode...
    Bonjour,

    Ah décidémment!! Je crois que j'ai trouvé un défaut a Python! La gestion des encodages de caractères!!


    Voila mon problème. J'ai a ma disposition une base de données Mysql dont "l'interclassement" des tables est utf8_unicode_ci:

    J'ai ensuite un script coté serveur et un petit programme client.

    Le script sur mon serveur fait une requete SQL pour récuperer des données dans la base et les renvoie a mon programme client. Je précise que l'encodage par défaut pour Python sur mon serveur est utf8.

    Pour ne pas avoir de problème d'encodage (accents supprimés,etc, etc....) entre les clients sur window$ et sur linux ou mac, j'ai utilisé la technique suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    c.execute("SELECT nom from Categories")
    for i in range(c.rowcount):
        line=c.fetchone()
        print line.encode(codage,"replace") 
    # le parametre codage est un argument envoyé par le client. il s'agit de son encodage par défaut
    Ainsi les chaines sont (en théorie) converties dans le bon encodage avant d'etre renvoyées....mais ca ne fonctionne pas...
    Voici mon erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UnicodeDecodeError: 'utf8' codec can't decode bytes in position 15-17: invalid data
    Cette position 15-17 correspond a un accent 'é'. Comment se fait il qu'unicode n'arrive pas a lire de l'unicode....j'y comprend décidément rien a ces encodages de caractères!!! Please HELP!!!

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Une suggestion (parce que l'encodage je ne maîtrise pas plus que toi): les soucis ne viendrait-il pas plutôt du module de MySQL parce que j'utilise des BDD Firebird (avec kinterbasdb) et je n'ai aucun souci avec l'encodage (je ne m'en occupe même pas).

    Edit: je ne sais pas si cela peut t'aider mais une autre personne avait aussi des soucis avec l'unicode et Mysql:
    http://www.developpez.net/forums/vie...hlight=mysqldb

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    pour m'être un peu battu aussi avec l'encodage sous Python, je n'ai qu'un conseil à te donner : travaille exclusivement en Unicode, que ce soit sur le client ou le serveur. Si réellement tu doit passer par une phase de transcodage, débrouille-toi pour qu'elle soit la plus tardive possible et uniquement pour de l'affichage.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre du Club Avatar de Mr Hyde
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 62
    Points
    62
    Par défaut
    Justement, j'ai repassé mes tables MySQL en utf-8_unicode et j'ai mis utf8 comme encodage par défaut sur mo serveur afin de "simplifier" un peu les choses....le probleme est que mon programme devra etre multiplateforme.

    Et je ne peut pas dire aux futurs utilisateurs:
    -Si vous etes sous windows, copiez le fichier sitecustomize.py fourni dans C:\Python24\site-packages

    -Si vous utilisez linux ....(en plus c'est encore pire car ca semble varier selon les distros)

    -Si vous utilisez un Mac...

    J'essaie de faire un programme aussi générique que possible...et je ne vois pas comment faire.Ma solution semblait efficace, mais python en a décidé autrement!

    En tout cas, je n'arrive vraiment pas a comprendre cette erreur. C'est quand meme dingue qu'une chaine utf8 ne puisse pas etre lue par le codec utf8!!

  5. #5
    Membre du Club Avatar de Mr Hyde
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 62
    Points
    62
    Par défaut
    Guigui-> Pour le module MySQLDB, je ne sais pas si le probleme vient de là, mais en tout cas, je ne peux pas faire autrement, a moins que tu ne connaise un autre module python qui permet de lire une BDD MySQL.

  6. #6
    Membre du Club Avatar de Mr Hyde
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 62
    Points
    62
    Par défaut
    Hello! Je ressort mon vieux post plutot que d'en créer un nouveau...

    Apres m'etre rendu compte que l'encodage par défaut de l'interpreteur python etait l'ascii, j'ai décidé de remettre TOUT en ascii....mais voila, j'ai un soucis:

    Dans phpmyadmin, j'ai le choix entre 'ascii_bin' et 'ascii_general_ci' et je ne sais pas lequel choisir....quelqu'un aurait il une idée?

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Mr Hyde
    Dans phpmyadmin, j'ai le choix entre 'ascii_bin' et 'ascii_general_ci' et je ne sais pas lequel choisir....quelqu'un aurait il une idée?
    Oui, poser la question sur le forum MySQL pour leur demander quelle est la différence entre les deux...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  8. #8
    Membre du Club Avatar de Mr Hyde
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 80
    Points : 62
    Points
    62
    Par défaut
    J'y ai pensé, mais je me suis permis de poser la question ici car je souhaite avant tout garder la compatibilité avec Python, et je ne pense pas qu'ils pourront m'aider a ce niveau dans le forum mysql....

    Bon ben tant pis, je vais essayer les deux, c'est pas la mort. Merci quand même. J'en profiterais pour vous dire lequel choisir (pour les prochains qui auront le probleme)

    A+

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Un peu off-topic vu que le thread a dévié sur les BDDs, mais voila la méthode que j'utilise pour convertir une chaine en utf-8 de manière systématique. Je doute que ça aide bcp l'auteur du thread, mais je suis preneur de toute critique vu que c'est une des méthodes les plus laides de mon appli :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import locale
     
    def utf8(myString):
     
        CURRENT_ENCODING = locale.getdefaultlocale()[1]
     
        if isinstance(myString, unicode):
            return myString
     
        return myString.decode(CURRENT_ENCODING)

  10. #10
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Citation Envoyé par franck260
    Un peu off-topic vu que le thread a dévié sur les BDDs, mais voila la méthode que j'utilise pour convertir une chaine en utf-8 de manière systématique. Je doute que ça aide bcp l'auteur du thread, mais je suis preneur de toute critique vu que c'est une des méthodes les plus laides de mon appli :
    Pourquoi ne pas faire un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_unicode_string = unicode(my_string)
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Je crois que ça revient au même... imaginons que ma chaine d'entrée soit café :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> unicode("café")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)
    >>> unicode("café","iso8859-15")
    u'caf\xe9'
    >>> unicode(u"café","iso8859-15")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: decoding Unicode is not supported
    Pour info mes chaines d'entrée proviennent de fichiers logs ouverts avec open() et contenant potentiellement des noms de fichiers accentués.

    Edit : je viens de trouver ça, je vais le tester...
    http://www.jorendorff.com/articles/unicode/python.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      import codecs
      # Open a UTF-8 file in read mode
      infile = codecs.open("infile.txt", "r", "utf-8")
    Effectivement j'aurais du mieux lire le thread ! Avec ce genre de technique, on prend le problème plus haut. Il suffit de passer iso8859-15 à codecs.open

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

Discussions similaires

  1. SDL_keysym.unicode n'est pas encodé en UTF-8
    Par YuGiOhJCJ dans le forum SDL
    Réponses: 1
    Dernier message: 05/12/2012, 13h55
  2. SELECT qui ne fonctionne pas, problème unicode ?
    Par GoustiFruit dans le forum Bases de données
    Réponses: 16
    Dernier message: 25/11/2011, 16h07
  3. Réponses: 2
    Dernier message: 06/04/2008, 12h18
  4. Unicode ne passe pas
    Par cels dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 04/01/2007, 07h35
  5. php et unicode copain ou pas ?
    Par ouquoi dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2006, 15h24

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