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 :

string, unicode, cp1252, utf-8, cp850, latin_1


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 42
    Points
    42
    Par défaut string, unicode, cp1252, utf-8, cp850, latin_1
    Bonjour,

    je développe en ce moment un logiciel en python faisant appel à une interface graphique, une base de donnée, des appels à des fonctions de Windows etc...
    Bref, j'ai quantité de formats de chaîne de caractère qui vont et viennent avec des encodages différents et malgré mes efforts, il y a toujours des erreurs dû aux différents encodages (quel merdier !)

    Ce genre d'erreur surtout: "UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1"

    N'y a-t-il pas un moyen de convertir toutes les chaînes dans le même format quelque-soit leur provenance ?
    Ou au moins, y a-t-il un moyen de connaître l'encodage d'une chaîne de caractère ? Un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if encoding(machaine) == 'cp850':
           print "je mange mon slip"


    Merci d'avance pour vos réponses. Ce problème est vraiment épuisant.

  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
    Il est pas possible de connaître simplement l'encodage d'une chaîne normale (sans passer par une analyse des caractères utilisés).

    Tu peux toujours convertir tout en unicode ( http://python.developpez.com/faq/?page=Unicode ) dès que tu reçois une chaîne de caractères de l'extérieur mais il te faut tout de même au préalable connaître l'encodage de base.

    Tes chaînes viennent d'où en général ? (d'une interface graphique ?)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 42
    Points
    42
    Par défaut
    Salut et merci pour ta réponse.

    Certaines de mes chaînes viennent de l'interface graphique (wx).
    D'autres de fonctions provenant des librairies win32 de python, de wmi pour python, d'autres enfin de ma base de donnée sqlite3 (mais bon, là j'ai compris qu'apparemment c'est du unicode utf-8, j'ai bon ?).

    Justement, j'avais pris l'habitude de tout convertir en unicode dans mes programmes mais le soucis est que faire ne fonctionne pas si machaine contient des accent car le defaultencoding est en ascii.

    Je ne souhaite pas changer le defaultencoding car l'application devra être déployé sur plusieurs postes et puis d'après ce que j'ai lu, ça pose des problèmes avec py2exe.

    Ma hantise concerne les noms de fichiers qui contiennent des accents et autres caractères spéciaux.

    En effet, si je connaissais à coup sûr le codage d'une chaîne, je pourrais faire machaine.decode('cp1232') par exemple.

    Mais voilà, je ne suis pas sûr que le codage utilisé dans wx soit le même que celui utilisé par les fonctions win32 que j'utilise, ni par les fonctions wmi.


    Voilà donc où j'en suis et je serais très heureux d'avoir des conseils là dessus.

  4. #4
    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
    pour wxPython, je bosse avec la version unicode, comme ca je suis sûr que tout ce qui vient de là est en unicode (et je le réencode lorsque nécessaire).

    ce qui vient de ta base sqlite3, il me semble que cela dépendra plutôt comment tu as enregistré tes données dedans.
    Bosser avec des fichiers avec accent ou caractères spéciaux, c'est à éviter (enfin à mon avis).

    Normalement, tu dois connaître l'encodage de tout ce qui t'arrive et de ce que tu utilises sinon tu vas avoir des galères.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 42
    Points
    42
    Par défaut
    pour wxPython, je bosse avec la version unicode, comme ca je suis sûr que tout ce qui vient de là est en unicode (et je le réencode lorsque nécessaire).
    Je viens de me rendre compte qu'apparemment ma version de wx est aussi une version unicode (en tout cas elle me renvoie des chaînes unicode)

    Citation Envoyé par Guigui_ Voir le message
    Bosser avec des fichiers avec accent ou caractères spéciaux, c'est à éviter (enfin à mon avis).
    Si seulement j'avais le choix!

    Normalement, tu dois connaître l'encodage de tout ce qui t'arrive et de ce que tu utilises sinon tu vas avoir des galères.
    Je suis en effet en train de vérifier chacun de mes modules et de vérifier quel type de chaîne il demande ou renvoie.

    J'ai aussi créé une classe pour la gestion des str et unicode.
    Je pense que ça aide à mieux s'y retrouver:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import locale
     
    class Coding(object):
     
        def __init__(self,coding):
     
            self.coding = coding
     
     
        def strToUnicode(self,string):
     
            return string.decode(self.coding)
     
     
        def unicodeToStr(self,unicode_string):
     
            return unicode_string.encode(self.coding)
     
     
        def anythingToUnicode(self,anything):
     
            if anything == None:
     
                return u''
     
            if isinstance(anything,unicode):
     
                return anything
     
            if isinstance(anything,str):
     
                return self.strToUnicode(anything)
     
            return unicode(anything)
     
     
        def anythingToStr(self,anything):
     
            return self.unicodeToStr(self.anythingToUnicode(anything))
     
     
        def unicodeEqual(self,anything1,anything2):
     
            return self.anythingToUnicode(anything1) == self.anythingToUnicode(anything2)
     
     
     
    # instance produite en fonction de l'environnement utilisateur
    LocaleCoding = Coding(locale.getdefaultlocale()[1])

Discussions similaires

  1. Remplacer string unicode dans exe
    Par Stolker dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 18/05/2010, 15h21
  2. [2K5] BULK INSERT / BCP / Unicode / BOM / UTF-16
    Par mioux dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/11/2009, 15h11
  3. Correspondance Unicode et UTF-8
    Par kazh75 dans le forum Général Python
    Réponses: 4
    Dernier message: 16/07/2008, 18h22
  4. Normaliser une string unicode
    Par vdumont dans le forum C++
    Réponses: 3
    Dernier message: 10/07/2007, 01h13
  5. [C#] Convertir un string UNICODE => ASCII
    Par alex57 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 10/09/2005, 20h32

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