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 :

nouvel épisode des mystères de l'encodage


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut nouvel épisode des mystères de l'encodage
    bonjour ,j'ai un probleme d' encodage dans un script qui injecte des données d'un fichier xl vers une base de données postgres.
    les caractères accentués sont transformés (ex élevée ==> \xe9lev\xe9e)
    cet import se fait au départ par une tranformation du fichier xl en fichier texte .ce fichier texte est correct.
    quand je lis ce fichier sous python c'est ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    ligne=fichier.readline()
    print ligne
    ...
    mais quand quand je transforme cette ligne en liste (pour recuperer mes valeurs séparément): problème les caractères accentués sont transformés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     ...
     liste=ligne.rstrip().split(';')
     print liste
     ...
    je suis sous python 2.6 , windows XP (sous python 2.5 windows 2000 ou xp pas de probleme)
    PS: j'ai testé (et détesté) des "encode" ou "decode" un peu de partout avec divers encodages , changer le codage de ma base de données(utf8,win1252)
    rien y fait... le bonheur!

  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,

    Il y a 2 pb différents à considérer:

    - la conversion

    - l'affichage

    Pour la conversion:

    Par exemple, si la chaine x codé cp1252 doit être convertie en code utf-8:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y = x.decode('cp1252').encode('utf-8')
    Pour l'affichage:

    La console d'affichage a un encodage qui peut être connu par: sys.stdout.encoding. L'affichage de la chaine y précédente encodée utf-8 est correctement affichée par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    z = y.decode('utf-8').encode(sys.stdout.encoding)
    print z
    Mais ça ne suffit pas: même si z a le bon encodage, celui de la console d'affichage, l'affichage de z dans une liste ne se passe pas bien. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    z = "abcéèçàù"
    print z, [z]
    abcéèçàù ['abc\xe9\xe8\xe7\xe0\xf9']
    Pour éviter cela, il suffit d'afficher une telle liste dans une boucle. Par exemple pour une liste L composées de chaines encodée pour la console d'affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def printliste(L):
       ch = '['
       for e in L:
          ch += e +  ', '
       ch = ch[:-2] + ']'
       print ch
     
    printliste([a, b, c])
    Et là, l'affichage est correct.

    Tyrtamos

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonjour,
    merci Tyrtamos, j'étais sûr que tu allais me répondre...
    je construirais ma requête avec une boucle for

    ce qui est bizarre c'est que j'utilisais ce script depuis 2 ans et je n'ai jamais eu de problème. je vais quand même vérifier que depuis 2 ans je n'ai jamais injecté de caractères accentués (ce qui m'étonnerais fortement). je te tiendrais au courant.

    bon we

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/02/2013, 16h51
  2. Notification des nouvelles releases des JRE.
    Par Nuwanda dans le forum Général Java
    Réponses: 1
    Dernier message: 18/06/2007, 15h07
  3. Compilateur et nouvelles instructions des CPU
    Par Heptaeon dans le forum Choisir un environnement de développement
    Réponses: 1
    Dernier message: 27/09/2006, 13h09

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