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 :

J'en perd mon Latin ByteArray Antislashs et classes.!?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 J'en perd mon Latin ByteArray Antislashs et classes.!?
    Non migrant vers Python 3 mais désireux de porter mon code jusqu'au standart de clavier Latin, j'ai rencontrer le problème suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    a='¹' #admettons #keyword=ALTGR + ²
    print a # ou print str(a)
    ¹
    b=[]
    b.append(a)
    b
    ['\xc2\xb9']
    Jusque la c'est bon mais dès que j'utilise ce concept maison dans une methode de classe je rencontre le problème suivant:
    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
     
    class Test () :
     
      def __init__(self) :
        self.text='¹'
     
      def duoproblemo(self) :
        for caracteres in self.text :
           print str(caracteres) #pas de problèmes
           duo_pb_array=[]
           duo_pb_array.append(caracteres)
           print duo_pb_array[0:] #ou return
     
    #A l'exécution je me trouve avec le probléme suivant:
    test=Test()
    test.duoproblemo()
    ¹
    ['\xc2']
    ['\xb9']
    Si vous avez bien suivit vous remarquerez que duo_pb_array ne contient qu'un seul element (j'en ai besoin) et en retourne 2... alors que si j' essaie d'acceder a l'attribut il retourne le premier element retouner ou le deuxieme selon son humeur et ne contient qu'un seul index qu'il retourne...
    Si l'on exécute se genre de code directement dans le shell le problème n'apparait pas.
    Je viens de tester proceduralement sa fonctionne apparament.
    Si quelqu'un sait d'ou viens le problème, je pense que c'est un coup fumant de byteArray a cause des Antislashs et de classe, il serai sympa de me faire comprendre.

    Je viens de tester ma classe exemple de çi-dessus:... Elle marche pas mais j'ai réussi le coup analogue a l'exemple dans mon vrai programme mais il retourne ce qui est annonçer dans les résultats de la classe exemple, qui marche pas je ne sais pourquoi maintenant,..

    Que python soit avec vous.
    Je tourne en Python26 sur Linux.

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

    Avec Python 2.x, on ne peut pas travailler en utf-8. On travaille en mode strictement non-unicode (latin1, etc...) ou on travaille en unicode interne (UCS2 = un UTF-16 simplifié). L'encodage 'utf-8' a un statut intermédiaire avec Python: il n'est pas considéré comme unicode (type str), mais c'en est un quand même...

    Par contre, on peut coder des chaines en utf-8 dans la page du code, à condition de le dire en haut (# -*- coding: utf-8 -*-), mais on doit les convertir pour les utiliser.

    Voilà 3 exemples (j'utilise ici idle configuré en utf-8 pour l'affichage):

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    print "x en 'latin1'"
    x = u"abcéèçàù".encode('latin1')
    for car in x:
        print car
    print "longueur de x: ", len(x)
    print
     
    print "x en 'unicode'"
    x = u"abcéèçàù"
    for car in x:
        print car
    print "longueur de x: ", len(x)
    print
     
    print "x en 'utf-8'"
    x = u"abcéèçàù".encode('utf-8')
    for car in x:
        print car
    print "longueur de x: ", len(x)
    print
    Résultat:

    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
     
    x en 'latin1'
    a
    b
    c
    é
    è
    ç
    à
    ù
    longueur de x:  8
     
    x en 'unicode'
    a
    b
    c
    é
    è
    ç
    à
    ù
    longueur de x:  8
     
    x en 'utf-8'
    a
    b
    c
    Ã
    ©
    Ã
    ¨
    Ã
    §
    Ã
    *
    Ã
    ¹
    longueur de x:  13
    On voit bien qu'en utf-8, le découpage de la chaine et sa longueur sont incorrectes.

    Et pour afficher une chaine située dans une liste: voir le fil: http://www.developpez.net/forums/d98...iture-fichier/

    Tyrtamos

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Tyrtamos, je ne comprends pas tes explications.
    UTF-8 est une représentation "multibytes" alors que:
    avec latin-1 est 1 lettre, 1 octet
    tout comme UCS est 1 lettre, 1 mot.

    Les défauts pris par Python 3 sont certainement plus cohérents mais la transformation d'unicode en utf-8 sera toujours multibytes.

    L'autre soucis est que je ne reproduis le problème "initial" que lorsque je fais n'importe quoi.

    '¹' n'est pas caractère ASCII.
    Le script Python doit préciser un encoding.
    Si je mets l'encoding correct (cp850 pour moi), çà fonctionne et il n'y a que le caractère (\xfb) dans la suite de bytes.

    Par contre, je récupère "\xc2\xb9" lorsque je déclare que le charset du source est utf-8 (alors qu'il est toujours cp850).
    Et dans ce cas, le nombre de bytes du litéral est 2...

    Difficile de blâmer la version de Python: on lui dit que les chaînes de caractères sont dans un charset alors qu'elles écrites dans un autre...

    Ceci dit, la propriété longueur de la forme ¹ = 1 n'est généralement vraie qu'en Unicode. Ce qui en Python 2, force à écrire le littéral ¹ sous la forme u'¹' - i.e. on ne travaille qu'avec des représentations Unicode et on fait les transformations lors des IO.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour wiztricks,

    Alors, explique donc ça (la chaine est encodée en utf-8, et affichée sur idle):

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    x = u"abcéèçàù".encode('utf-8')
    print len(x)
    13
     
    for car in x:
        print car
     
    a
    b
    c
    Ã
    ©
    Ã
    ¨
    Ã
    §
    Ã
    *
    Ã
    ¹


    Tyrtamos

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut Tyrtamos,

    Tu ne fais que constater que la sérialisation d'une suite de mots/caractères Unicode en UTF-8 fait correspondre plusieurs octets aux caractères non ASCII.
    x = u"abcéèçàù" # x est Unicode de longueur 8
    x = u"abcéèçàù".encode('utf-8') # x est une suite de bytes de longueur 2*5+3
    Parce que 3 caractères pur ASCII // mais certains caractères sont codés sur 4 bytes...
    Un truc à faire: on met çà dans le fichier toto.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # -*- coding: cp850 -*-
     
    x = u"abcéèçàù".encode('utf-8')
    Puis, on lance l'interpréteur Python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import io
    f = io.open('toto.py', 'r+b')
    f.read()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Je sais tout ça, et je n'ai pas dit autre chose: je voulais simplement montrer pourquoi on ne devait pas travailler en utf-8 avec Python 2.x, en réponse à la question posée.

    Il reste que la situation de l'utf-8 est ambigüe avec cette version de Python: c'est un vrai unicode (http://fr.wikipedia.org/wiki/Unicode), mais non reconnu comme tel (type str).

    Tyrtamos

Discussions similaires

  1. <table> : J'y perd mon latin !
    Par zakuli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 07/02/2009, 16h32
  2. Problème de typage: j'en perds mon latin
    Par Garulfo dans le forum Caml
    Réponses: 7
    Dernier message: 10/06/2008, 13h22
  3. getElementsByName - j'y perds mon latin !
    Par herve42 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/08/2007, 20h04
  4. Réponses: 6
    Dernier message: 23/05/2005, 15h38

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