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 :

python 2.7 UnicodeWarning: inégalité


Sujet :

Python

  1. #1
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut python 2.7 UnicodeWarning: inégalité
    Salut les python,
    Je vous demande votre aide sur un traceback:
    Il consiste a comparer 2 valeurs: une calculer a partir d'un fichier et l'autre d'une saisie clavier avec un Pmw.EntryField() seulement je reçoit le traceback suivant en cas de caractères non-ascii:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    password
    édé
    ZiffererRight.22.13.1.py:3101: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
      if password_gui.anfang_password_anfrage_1.get() == self.password and i == len(self.linien) :
    ZiffererRight.22.13.1.py:3107: UnicodeWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
      elif  password_gui.anfang_password_anfrage_1.get() != self.password or i != len(self.linien) :
    Les mots 'password' et 'édé' sont des mots de passe de teste et sont le fruit d'un:
    dans le code.
    Il faut savoir que le Pmw.EntryField est a typage dynamique suivant ce qu'on entre comme valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Pmw.EntryField.get() avec des caractères ascii sa donne <type str>
    Pmw.EntryField.get() avec des caractères non-ascii sa donne <type unicode>
    J'ai vraiment tout essayer même avec le module codecs afin d'encoder les valeurs et un simple unicode(self.password) me renvoie une erreur: UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
    Si vous savez comment je peut obtenir le résultat d'égalité de la structure conditionnel en question, qui marche a condition que les valeurs soit des caractères ascii, autrement ce n'est pas le cas et c'est la que j'ai besoin de vos avis éclairés.
    Merci pour votre aide.

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Ah, python2.x et unicode…

    Bon, en résumé, self.password est un str, et password_gui.anfang_password_anfrage_1.get() peut renvoyer soit un str, soit un unicode… Donc amha, il n’y a qu’une solution, tout convertir en unicode.

    puisque blabla.get() ne renvoie un str qu’en l’absence de tout caractère spécial, on peut utiliser l’encodage par défaut (ascii) sans problème.

    Pour self.password, c’est un peu plus compliqué, car son encodage dépend de la façon dont il est créé/défini. Sous windows, il a quand même pas mal de chance d’être en cp1252 (et sous linux, en latin-9…).

    Donc, quelque chose comme ça devrait le faire (sans le code de départ, impossible d’être plus précis)*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pswd = unicode(password_gui.anfang_password_anfrage_1.get())
    if pswd == unicode(self.password, 'cp1252') and i == len(self.linien) :
    Et oui, unicode() prend le codec en second paramètre (optionnel)…

  3. #3
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Merci pour la réponse:
    j'avais déjà essayer ce que tu a proposer, j'ai essayer un peu tout ce qui me passais par la tête sans résultat:
    c.a.d:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unicode(self.password, 'utf-8')
    car mon programme est encoder en utf-8 et le traitement de données se fait par le module codecs et la méthode codecs.utf_8_encode().
    Je vais quand même réessayer et pendant que j'attendais une réponse j'ai écrit un petit script qui permettrai de tester quelques codes et de donner une vision minimale du problème.
    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
     
    # -*- coding: utf-8 -*-
    from Tkinter import *
    import Pmw
     
    def test(event) :
      a='édé'
      if d.get() == a :
        c.configure(text='You win')
      else :
        c.configure(text='You lose')
     
    a=Tk()
    b=Pmw.initialise(a)
    c=Label(a, text='Entrez un mot de passe non-ascii\n le mot a trouver est: édé')
    d=Pmw.EntryField(b)
    d.component('entry').focus_set()
    d.component('entry').bind("<Return>", test)
    c.pack()
    d.pack()
    a.mainloop()
    D'ailleurs ta solution fonctionne dans ce script, je m'y mets de suite, merci beaucoup.
    En gros si vous arriver au text de Label 'you win' vous aurez trouver une solution a mon problème.
    Misc: j'ai repris un programme de chiffrage (Zifferer signifie chiffrer en allemand) et je me suis aperçus que comme mot de passe il ne pouvais que lire les mot de passe ascii auxquelles il ne devrai pas etre limité.
    Merci pour vos réponses.

  4. #4
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Grand merci a mont29 qui m'a sauver d'un README annonçant que vous ne pourrez qu'utiliser des carartères ascii dans vos mot de passe ce qui n'est pas le but de mon programme.
    Le test d'un type correspond a:
    ce que je n'ai pas fait dans mes essaies car j'ai directement convertie en unicode('édé',utf-8') ce qui a provoquer une erreur et ce qui m'y a induit aussi.
    Merci a mont29 et a ce site génial qu'est www.developpez.net.

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

Discussions similaires

  1. python 2.7.3 UnicodeWarning
    Par khaled87 dans le forum Général Python
    Réponses: 6
    Dernier message: 28/12/2013, 11h03
  2. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32
  3. module .so pour python... ?!
    Par totoetlititi dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 09/03/2004, 14h51
  4. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 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