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 :

problème d'encodage caractère hexadecimaux


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Par défaut problème d'encodage caractère hexadecimaux
    bonjour à tous

    je me mélange encore sérieusement avec des problèmes d'encodage

    je reçois via le port série et la librairie pyserial des caractères binaire codés en hexadécimal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ps=serial.Serial(...)
    caractere=ps.read()
    je reçois donc la valeur b'\x82' pour la lettre 'é'

    mon problème est que je n'arrive pas à convertir cette valeur pour afficher le 'é' dans une chaine de caractère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine=caractere.decode('utf-8')
    me renvoie l'erreur :UnicoDedecodeError:utf8 codec can't decode byte 0x82

    en cherchant, j'ai compris que la fonction decode prenait en paramètre un caractère unicode, mais mon b'\x82' est une valeur ascii hexadécimale
    comment faire la transformation et me retrouver avec le 'é' dans ma variable chaine ??

    merci

    sorry, je n'ai pas du tout posté sur le bon forum, si un modérateur peut me déplacer...

  2. #2
    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,

    Regardez le tableau "Définition du nombre d'octets utilisé" a l'URL.
    Un caractère qui code en hexa est représenté par b'\x82' s’écrit en binaire: 1000 0010 devrait être précédé d'au moins un octet pour être de l'utf-8.

    Tout ce qu'on peut dire, c'est que ce n'est pas de l'UTF-8.
    Ce n'est pas non plus du latin-1!

    Pourquoi voulez vous que ce soit un "é"?

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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Par défaut
    merci pour la réponse

    la machine connectée au port série m'envoie une suite de bytes:
    b'a' pour la lettre 'a' par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    caractere=ps.read()
    print(caractère)
    --->b'a'
    print(caractere.decode('utf-8'))
    ---->'a'
    quand la machine m'envoie la lettre 'é' je reçois le code ascii hexadécimal 82
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    caractere=ps.read()
    print(caractère)
    --->b'\x82'
    j'ai bien compris que ce n'était pas de l'unicode mais un code ascii et je n'arrive pas à transformer le bytes b'\x82' que me renvoie la fonction serial.read() en une chaine de caractères qui contiendrait 'é'

    fonction?? (b'x82') renverrait 'é'

    merci encore

    roland

    je pratique python depuis 2-3 mois...encore des choses à apprendre

  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,

    L'hexa 82 correspond à 'é' avec la page de code 'cp850' qui est l'encodage de l'ancien DOS (la console cmd des Windows actuels)

    Voir: https://fr.wikipedia.org/wiki/Page_de_code_850.

    Et ce n'est pas le même encodage que Windows (cp1252): les caractères accentués ne sont pas codés pareils.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Par défaut
    merci

    ma machine envoie donc des caractère 'dos'
    elle doit avoir 20 ans donc ça ne m'étonne pas
    mais comment je peux convertir ce qu'elle m'envoie dans une chaine de caractère python qui est donc forcement de l'unicode sous python 3 (si j'ai bien compris)?

    roland

  6. #6
    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,

    Si vous suivez la logique de Tyrtamos, l'encoding serait 'cp850' plutôt que 'utf-8'. Pour le convertir en unicode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> z = b'\x82'
    >>> z.decode('cp850')
    'é'
    Comme je ne comprends toujours pas comment/pourquoi ces caractères la arrivent sur le port série de la machine toute neuve, pas sur que cela suffise.
    Dit autrement: il se passe quoi cote vieux PC pour que?


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

  7. #7
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonsoir,
    Tout à fait…

    Surtout qu'en essayant les différents codecs de Python, plusieurs semblent convenir.
    Il semble donc qu'il faille en chercher l'explication dans les pages de pyserial!!

    (PS: au moins cp437, cp720, cp775, cp850, cp852, cp857, cp858, cp860, cp861, cp863, cp865. Même si certains sont spécifiques à des langues, plusieurs semblent assez génériques)

    Clodion

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Par défaut
    merci de s'intéresser à mon cas

    on progresse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    z=b'\x82'
    print(z.decode('cp850'))
    j'obtiens bien la lettre 'é' si je passe par IDLE que ce soit sous window ou linux

    Par contre si je fais python3 mon_programme depuis un terminal linux (j'utilise putty) j'ai le message suivant:

    print(z.decode('cp850'))
    UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 0: ordinal not in range(128)

    mon '\x82' s'est transformé en 'xe9' !!!!! ?????????

    Evidemment mon programme va être lancé d'une console linux!!!

    La "pas toute neuve machine"(qui marche encore très bien, ils ne devaient pas connaitre l'obsolescence programmée à l'époque) est une machine d'analyse qui envoie ses résultats sous la forme "libellé=résultat"
    certains libellés contiennent des accents d'où mon problème

    j'avais fait un programme avec delphi qui me récupérait mes analyses :
    'résultat 1:100' ...

    je monte un autre poste d'analyse, et plutot que d'avoir un ordi complet pour la réception des analyses, j'envisage d'utiliser un raspberry pi qui prend moins de place et coute moins cher! d'ou le passage sous linux et python
    maintenant je récupère l'analyse:
    'r\x82sultat 1:100'....
    je voudrait obtenir le même résultat qu'avec delphi

    roland

  9. #9
    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
    le 'e9' vient du fait que le 'é' est cette fois en 'utf-8'.

  10. #10
    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
    Il y a tout plein de concepts superposes.
    j'obtiens bien la lettre 'é' si je passe par IDLE que ce soit sous window ou linux
    1. Vous récupérez b'\x82' sur le port série,
    2. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      print(ch.decode('cp850'))
    3. le symbole "é" s'affiche
    4. vous etes content
    5. Puis:
    Par contre si je fais python3 mon_programme depuis un terminal linux (j'utilise putty) j'ai le message suivant:
    Si c'est le "programme qui lit les mêmes code sur le port série", ca plante ailleurs (des qu'on lit un truc >127):
    Regardez bien le message:
    print(z.decode('cp850'))
    UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 0: ordinal not in range(128)
    En gros ça dit que sous Linux Python n'a pas trouve d'encoding 'cp850'.
    Mon python3/Centos donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ python3
    Python 3.3.2 (default, Jun  4 2013, 19:21:50) 
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> z=b'\x82'
    >>> print (z.decode("cp850"))
    é
    >>>
    Votre caractère est '\xe9'... cp850 devrait afficher "autre chose" que le glyph attendu: \xe9 est un octet est cp850 la regle de correspondance.

    On fait quoi?
    [A] Lire le cp850 sur Windows. Une fois le cp850 lu et transforme en Unicode, les écrire en 'utf-8' une fois pour toute.
    Les 2 OS sauront quoi faire.

    [B] Ajouter l'encoding sous Linux?

    Option A ou option B ou ... (autre chose) vous demanderons un travail cote "codage". Pas la peine de foncer tête baissée sur votre clavier...
    De toutes façons, si vous débutez, comprendre ce que signifient A ou B cote "code" devrait vous pousser a poser question.

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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Par défaut
    merci pour toutes ces explications

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

Discussions similaires

  1. Problème d'encodage - caractères speciaux
    Par tomix81 dans le forum Général Python
    Réponses: 2
    Dernier message: 13/07/2007, 01h03
  2. problème avec encodage caractère Servlets
    Par dialloma dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 06/07/2007, 09h09
  3. [XML] problème d'encodage caractère €
    Par #CR-7 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 11/01/2007, 10h45
  4. Probléme encodage caractéres spéciaux MYSQL
    Par FoxLeRenard dans le forum Installation
    Réponses: 1
    Dernier message: 20/02/2006, 12h10
  5. Réponses: 1
    Dernier message: 02/02/2006, 23h12

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