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 :

Transformer une chaîne ascii avec accents codés en utf8


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Transformer une chaîne ascii avec accents codés en utf8
    Salut, le titre n'est peut-être pas très clair : je m'explique :

    Je récupère (à partir d'un service web) une chaîne avec des caractères comme ceux qui suivent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e avec accent aigu : \xc3\xa9
    Ce qui donne, si on le tape dans l'interpréteur python:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print "e avec accent aigu : \xc3\xa9"
    e avec accent aigu : é
    Cependant, je n'arrive pas à convertir cette chaîne en unicode de manière à ce que "\xc3\xa9" soit convertit en "é" (car cette chaîne est ensuite affichée via un module d'interface graphique, plus précisément PyQt)

    En effet, quand j'essaye de convertir, voilà ce qui se passe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> unicode('\xc3\xa9')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> u'\xc3\xa9'
    u'\xc3\xa9'
    >>> print u'\xc3\xa9'
    é
    PS : Si cette question a déjà été posée, merci de me rediriger, mais je n'ai pas trouvé de sujet traitant de cela

  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
    Tu peux regarder dans la FAQ: http://python.developpez.com/faq/?page=Unicode

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    En effet, je n'avais pas cette partie. Mais il s'avère que cette méthode ne marche pas non plus car je viens de découvrir la chaîne de base elle-même était codée en unicode. En fait, je n'ai pas "\xc3\xa9" à convertir en unicode mais u"\xc3\xa9" à convertir en unicode (correct) : je suis donc toujours coincé

  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
    "\xc3\xa9" n'est pas une chaîne unicode mais une chaîne utf-8


    pour avoir une chaîne unicode depuis "\xc3\xa9"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eunicode = '\xc3\xa9'.decode('utf-8')
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eunicode = unicode('\xc3\xa9', 'utf-8')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print '\xc3\xa9'.decode('utf-8')
    é
    la chaîne unicode u"\xc3\xa9" représente un autre caractère (voire deux autres)

  5. #5
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Je pense que son problème maintenant est le fait que la valeur qu'il recoit est stocké dans un type unicode et non dans un str (certaines lib renvoient de l'unicode et non des str). Si c'est bien le cas, l'exemple précédent ne fonctionne pas.

    Essaye cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    v = u'\xc3\xa9'
    v = v.encode('raw_unicode_escape')
     
    res = v.decode('utf8')
    print res
    En gros il reçoit dans une chaîne unicode, la représentation alpha unicode du caractère.

    Enfin je ne suis pas sur de mon interprétation, vu que je galère toujours avec ces conversions moi aussi !
    D'autre part, même si l'exemple que je donne semble fonctionner, il y a peut être plus simple.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par Guigui_ Voir le message
    "\xc3\xa9" n'est pas une chaîne unicode mais une chaîne utf-8
    Je pensais que c'était la même chose. Décidément, je m'embrouille avec les les différents codages.

    En gros il reçoit dans une chaîne unicode, la représentation alpha unicode du caractère.
    C'est en effet bien le problème que j'avais, ou du moins que je pensais avoir car, il s'avère que j'avais (encore) mal diagnostiqué mon problème. La chaîne que j'obtient est en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> print s
    \xc3\xa9
    >>> s
    '\\xc3\\xa9'
    Je n'obtient donc pas les caractères codés par \xc3 et \xa9, mais la chaîne contenant uns à uns les caractères '\', 'x', 'c', '3', '\', 'x', 'a', '9'

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    J'ai trouvé une solution à mon problème. C'est très sale, mais ça marche. J'ai également dû prévoir la présence de deux codages différents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    try:
        s2 = unicode(eval('"'+s1+'"'), 'utf8')
    except:
        s2 = unicode(eval('"'+s1+'"'), 'iso-8859-1')

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

Discussions similaires

  1. Transformer une chaîne avec une regex
    Par Watilin dans le forum Débuter
    Réponses: 2
    Dernier message: 16/08/2011, 11h58
  2. [RegEx] Transformer une chaîne
    Par Neuromancien2 dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2007, 18h27
  3. Réponses: 3
    Dernier message: 16/04/2007, 14h01
  4. transformer une chaîne en double
    Par akrobat dans le forum C++
    Réponses: 8
    Dernier message: 20/06/2006, 19h20
  5. [Regex] Comment tester une chaîne ASCII 7bits ?
    Par Raduris dans le forum Framework .NET
    Réponses: 4
    Dernier message: 27/03/2006, 09h42

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