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 des accents d'un str vers unicode impossible


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 16
    Points : 16
    Points
    16
    Par défaut Conversion des accents d'un str vers unicode impossible
    Bonjour,

    Après une matinée de recherche infructueuse, en désespoir de cause j'ouvre un sujet pour un problème de conversion d'un string en unicode. J'ai un script qui bloque sur cette erreur :
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 43: ordinal not in range(128)

    Voici mon code :
    print type(monstring)
    print monstring
    print monstring.decode('latin1')
    monstring = unicode(monstring)

    Voici ma sortie :

    <type 'str'>
    #########################################_Dédié
    #########################################_Dédié
    File "monfichier.py", line 90, in ?
    monstring = unicode(monstring)

    (Je masque la partie du string qui avant le problème pour éviter toute identification)
    Le numéro de ligne d'erreur
    Mon gros problème ici est selon moi le caractère "é", qui ne parvient pas être transformé en unicode depuis ma variable de type str. Le problème est que je n'initialise pas cette variable et sa valeur moi même, je la récupère depuis une connexion oracle qui m'impose un string, donc je ne peux que tenter de la convertir en unicode à postéri, ce qui ne fonctionne pas. J'ai eu beau cherché à droit à gauche comment convertir un string en unicode, en retirer les accents d'un string en python, je n'ai trouvé que des solutions qui ne fonctionnent pas.

    Si avez des idées, je vous remercie d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Manfried Voir le message
    Mon gros problème ici est selon moi le caractère "é", qui ne parvient pas être transformé en unicode depuis ma variable de type str. Le problème est que je n'initialise pas cette variable et sa valeur moi même, je la récupère depuis une connexion oracle qui m'impose un string, donc je ne peux que tenter de la convertir en unicode à postéri, ce qui ne fonctionne pas. J'ai eu beau cherché à droit à gauche comment convertir un string en unicode, en retirer les accents d'un string en python, je n'ai trouvé que des solutions qui ne fonctionnent pas.
    Qu'est ce qui vous permet d'affirmer que le str est codé en "latin-1"?
    A vu de nez, la sortie de decode('latin1') traduit le é sur plusieurs bytes.
    Ca pourrait être de l'utf-8.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> s = u'dédié'
    >>> s.encode('utf-8')
    'd\xc3\xa9di\xc3\xa9'
    >>> z = s.encode('utf-8')
    >>> print z.decode('latin-1')
    dédié
    >>> unicode(z)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal
    not in range(128)
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Qu'est ce qui vous permet d'affirmer que le str est codé en "latin-1"?
    Je ne l'affirme pas, je l'ai juste mis dans mon code pour tester le résultat en sortie, mais je confirme n'avoir aucune idée de l'encodage de mon str, je n'ai d'ailleurs pas trouver comment le tester

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Bon, j'ai trouvé ma solution, pour ceux qui pourraient avoir le problème un jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def removeaccents(mystring, encode='cp1252'):
    	return unicodedata.normalize('NFKD', unicode(mystring, encode)).encode('ASCII', 'ignore')
    Dans mon cas, il se trouve que le charset est cp1252

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Manfried Voir le message
    Bon, j'ai trouvé ma solution, pour ceux qui pourraient avoir le problème un jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def removeaccents(mystring, encode='cp1252'):
    	return unicodedata.normalize('NFKD', unicode(mystring, encode)).encode('ASCII', 'ignore')
    Dans mon cas, il se trouve que le charset est cp1252
    Bonjour,

    Avez-vous pensé à mettre vos en-têtes de fichier dans vos scripts :

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # -*- coding: cp1252 -*-
    import module
    ...etc...
    Voir PEP 0263 : http://legacy.python.org/dev/peps/pep-0263/

    Parfois, ça ne tient qu'à ça.

    EDIT: j'ai oublié le how-to sur unicode : https://docs.python.org/2.7/howto/unicode.html

    @+.
    Dernière modification par Invité ; 19/05/2014 à 14h15.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Manfried Voir le message
    Dans mon cas, il se trouve que le charset est cp1252
    cp1252 est le code-point équivalent à "utf-8" - équivalent au sens de microsoft.
    Le driver Oracle que vous utilisez devrait être capable de mettre les colonnes strings ou unicode sous forme unicode (Python).

    Comme votre question initiale était de convertir une chaîne de caractère contenant des accents en "unicode".
    Si la solution est de virer ces foutus accents, çà laisse penser à un méchant workaround où on fait tomber le truc en marche sans trop se poser de questions.

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

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

Discussions similaires

  1. Problème de conversion des accents
    Par s.azdine dans le forum Administration
    Réponses: 0
    Dernier message: 06/07/2008, 09h17
  2. conversion des accents avec streamreader
    Par olibara dans le forum C#
    Réponses: 1
    Dernier message: 04/04/2008, 16h02
  3. Conversion des accents AS400 vers Server
    Par amu01 dans le forum AS/400
    Réponses: 2
    Dernier message: 01/08/2007, 14h38
  4. Conversion des accents
    Par amu01 dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 01/08/2007, 11h17

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