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 :

Conversion bytes vers string


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    P.G
    P.G est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 158
    Par défaut Conversion bytes vers string
    Bonjour,

    Je reçois après un traitement un message sous la forme d'une liste de bytes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListe = [b'a', b'b', b'c', b'd', b'\xc3', b'\xa9']
    Je bute sur le problème suivant je souhaite la convertir en chaine de caractères
    et donc retrouver le résultat ci-contre 'abcdé'

    mais comment faire ?

    Merci par avance pour tout coup de main.

    Cordialement.

    P.G

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a = maListe[4]+maListe[5]
    >>> a.decode('utf8')
    'é'
    Va falloir travailler sur la liste pour savoir quand tu dois additionner ou non les éléments successifs si tu veux automatiser le truc.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Pas évident.
    Le souci c'est que l'utf-8 encode ses éléments de façon variable. Si l'élément est ascii, il prendra un octet (tu le retrouves donc dans b'a', b'b', etc) mais si l'élément n'entre pas dans l'ascii, alors il en prend deux (ou 3 ou 4 si besoin). Ainsi "é" qui se code b'\xc3\xa9' fait deux octets.
    Sauf que toi, tu le reçois sous forme séparée b'\xc3', b'\xa9'. Comment ensuite recoller les deux ? Ou plutôt comment déterminer que telle valeur \xYY est unique ou bien doit être combinée avec la suivante \xZZ ? Il me semblait avoir lu dans la doc de l'utf que si le premier bit était à 1, alors cela signifiait que l'octet remonte sur le précédent mais ça ne marche pas. En effet, 0xa9 vaut 10101001 ce qui correspond donc on rajoute 0xc3 mais 0xc3 vaut 11000011 donc on devrait y rajouter ensuite le précédent 'd' mais lui il ne doit pas se rajouter.

    J'ai essayé s="".join(x.decode("latin-1") for x in maListe) mais commeje m'en doutais, il a pris les caractères un à un, convertissant b'\xc3' puis b'\xa9'

    [edit]C'est finalement Le Narvalo qui m'a donné l'idée (mais il ne le sait pas).
    Suffit de coder un truc essai/echec. Tant que ça rate on rajoute le caractère suivant (enfin plus exactement le précédent)

    Code python : 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
    def toStr(l):
    	s=""
    	tmp=b""
    	for x in reversed(l):
    		tmp=x+tmp
    		try:
    			s+=tmp.decode("utf-8")
    			tmp=b""
    		except UnicodeError:
    			pass
    		# if
    	# for
    	return "".join(reversed(s))
    # toStr()
     
    maListe=[b'a', b'b', b'c', b'd', b'\xc3', b'\xa9']
    print(toStr(maListe))
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Invité
    Invité(e)
    Par défaut
    Et un truc du genre peut-être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def toto():
        letter = b""
        for x in maListe:
            letter+=x
            try:
                print(letter.decode('utf8'))
                letter = b""
            except UnicodeDecodeError:
                pass
        if letter:
            print(letter.decode('utf8'))
    C'est de la bidouille...

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Et un truc du genre peut-être ?
    Trop tard
    En plus avec letter+=x tu crées la chaine à l'envers...

    Citation Envoyé par LeNarvalo Voir le message
    C'est de la bidouille...
    Pas tout à fait. Ca correspond à l'esprit Python expliqué au chapitre XIX/8 de mon tutoriel => on tente et tant que ça marche pas on retente (devise shadock: plus on essaye plus on a de chances que ça marche)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Invité
    Invité(e)
    Par défaut
    En plus avec letter+=x tu crées la chaine à l'envers...
    Hein ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> toto()
    a
    b
    c
    d
    é

    On dirait un débutant !

    Allez pour changer un générateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def toto():
        letter = b""
        for x in maListe:
            letter+=x
            try:
                yield (letter.decode('utf8'))
                letter = b""
            except UnicodeDecodeError:
                pass
        if letter:
            yield letter.decode('utf8')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print("".join(toto()))
    abcdé
    Dernière modification par Invité ; 19/09/2022 à 22h28.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Hein ?
    Je comprends pourquoi ça "marchote" chez-toi : je suis parti du principe réfléchi que si b'\xa9' ne fonctionne pas, il faut lui rajouter alors b'\xc3'. Donc je traite la chaine à l'envers (d'où le reversed en début de boucle) et fatalement je rajoute les caractère qui viennent ensuite devant les caractères déjà lus, d'où le tmp=x+tmp qui n'est pas la même chose que tmp+=x (parce que pour les chaines, l'addition n'est pas commutative ).
    Toi tu lis la chaine au naturel, comme ça te vient. Il se trouve que par chance b'\xc3' ne fonctionne pas donc tu lui rajoutes (en te gaudriolant comme un bon paysan) le suivant b'\xa9' et tu retombes par chance sur tes pattes.
    Mais (et là c'est plus sérieux) l'utf-8 ça se lit de la fin vers le début. Tu peux très bien tomber sur un truc style b'a' + b'\xa9' or b'a' reste traductible
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par P.G Voir le message
    mais comment faire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> L = [b'a', b'b', b'c', b'd', b'\xc3', b'\xa9']
    >>> b''.join(L).decode('utf-8')
    'abcdé'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    ça à l'air bien fichu cette table.
    Ben quand-même, un truc destiné à remplacer et à unifier tout l'encodage mondial en englobant le grec, le cyrillique, l'arabe et l'asiatique, faut que ce soit un minimum réfléchi.
    Tel que je l'ai compris, les caractères "simples" sont encodés en ascii sur 7 bits (afin d'assurer la compatibilité avec l'ascii) et ensuite quand ça se complexifie, le dernier bit passe à 1 indiquant que l'encodage continue sur le caractère d'avant, et etc jusqu'à je crois 4 octets possibles.

    Citation Envoyé par wiztricks Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> b''.join(L).decode('utf-8')
    'abcdé'
    >>>
    Voilà. Je savais qu'il arriverait et nous éclaterait tous avec un truc en une ligne aussi simple qu'évident...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. conversion de byte vers string
    Par dalilnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/07/2008, 15h05
  2. Conversion byte vers réel en Delphi7
    Par delphino7 dans le forum Langage
    Réponses: 3
    Dernier message: 03/05/2008, 15h25
  3. conversion hexadecimal vers string
    Par acognard dans le forum C#
    Réponses: 1
    Dernier message: 16/10/2007, 16h30
  4. conversion Byte[] vers int
    Par skud dans le forum C#
    Réponses: 5
    Dernier message: 17/05/2007, 12h14
  5. Conversion LPCTSTR vers string
    Par The Lord of Nesquik dans le forum C++
    Réponses: 15
    Dernier message: 02/07/2006, 19h37

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