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 :

python et unicode => erreur sur freebsd (et pas sur mac)


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Points : 19
    Points
    19
    Par défaut python et unicode => erreur sur freebsd (et pas sur mac)
    Bonjour à tous,

    Je me prends la tête depuis ce matin sur une ligne de code qui génère une exception sur notre serveur freebsd. En cherchant, j'ai réussi à recréer le même problème dans un simple code.

    Voici le résultat sur notre serveur dédié (freebsd 7.1) :

    [root@**** /home/***/test]# python2.6 --version
    Python 2.6.1
    [root@**** /home/***/test]# cat test.py
    # -*- coding: utf-8 -*-

    import glob

    file = "tête"

    print file
    print type(file)

    file_unicode = unicode(file, 'utf8')
    print file_unicode
    [root@**** /home/***/test]# python2.6 test.py
    tête
    <type 'str'>
    Traceback (most recent call last):
    File "test.py", line 11, in <module>
    print file_unicode
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xea' in position 1: ordinal not in range(128)
    [root@**** /home/***/test]#
    La même procédure est effectuée sur mon iMac et je n'ai aucun problème :

    Vincent:test Vincent$ python --version
    Python 2.6.1
    Vincent:test Vincent$ cat test.py
    # -*- coding: utf-8 -*-

    import glob

    file = "tête"

    print file
    print type(file)

    file_unicode = unicode(file, 'utf8')
    print file_unicode
    Vincent:test Vincent$ python test.py
    tête
    <type 'str'>
    tête
    Vincent:test Vincent$
    Quelqu'un aurait une idée sur la source du problème ?


    D'avance,

    Merci

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Perso dans un script lorsque je veux afficher un caractère non ascii (accent) sur ma fenêtre DOS j'utilise cette méthode:

    print u"chaine : ",chaine1 + chaine2.decode("windows-1252")

    Je pense qu'il te faut décoder correctement avec le bon codec unix la chaine a afficher, après lequel ?
    Déja une piste...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 224
    Points
    224
    Par défaut
    Citation Envoyé par zoubli Voir le message
    Je pense qu'il te faut décoder correctement avec le bon codec unix la chaine a afficher, après lequel ?
    Déja une piste...
    Si c'est pour un print en console, sys.stdout.encoding fournit l'encodage à utiliser. Donc à essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import sys
    file_unicode = unicode(file, 'utf8')
    print file_unicode.encode(sys.stdout.encoding)

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai finalement eu réponse sur le chan IRC #python-fr.

    J'avais également le problème pour des fonctions telles que os.rename(a, b) avec a et b en utf-8 accentués.

    La raison est que MAC OS X gère en interne les chaînes en utf-8 et freebsd en ASCII. Donc la console freebsd gère en ASCII ainsi que les fonctions travaillant sur le système (gestion de fichiers, etc.).

    Python convertit donc automatiquement dans l'encodage de l'OS. Sous MAC OS X, pas nécessaire c'est aussi de l'utf-8, sous freebsd il convertit vers l'ASCII et là c'est le drame

    Solutions :

    1) Si c'est juste pour afficher des chaines utf-8 (sur un OS en ASCII tel que freebsd) une solution rapide est de mettre la variable d'environnement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export PYTHONIOENCODING=utf8
    sur certains shell ca sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # SET PYTHONIOENCODING utf8
    Rem : cette variable n'existe que depuis Python 2.6

    2) Changer la locale de l'OS (je n'ai pas testé)
    3) Ne pas travailler en utf-8 ( :/ )
    4) Passer en python 3.2 qui, parait-il, gère ça proprement.

    Comme je reçois cette chaine en ASCII et que je la convertissait en utf-8 (je pensais que c'était une bonne manière de procéder... pas sur tous les systèmes apparemment) je vais m'abstenir de la convertir (sauf quand si j'en ai vraiment besoin).

    Dans la version suivante, je passerai en python 3.2

    Merci tout de même ;-)

    Vincent

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par and1hotsauce Voir le message
    Comme je reçois cette chaine en ASCII et que je la convertissait en utf-8 (je pensais que c'était une bonne manière de procéder... pas sur tous les systèmes apparemment) je vais m'abstenir de la convertir (sauf quand si j'en ai vraiment besoin).
    La chaîne de caractère "tête" ne peut être l'ASCII parce que "contient" des octets supérieurs à 127.
    Pour la convertir, il faut savoir comment elle est "codée": c'est ce que fait l'instruction "# -*- coding: utf-8 -*-" pour peut que l'éditeur fasse le boulot derrière.

    file = "tête"
    Sous Python2, cela crée une variable file pointant sur une suite de bytes codés utf-8. En python 3, ce sera de l'Unicode.
    file_unicode = unicode(file, 'utf8')
    On fabrique l'Unicode....

    print file_unicode
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xea' in position 1: ordinal not in range(128)

    Le print doit sérialiser la chaîne Unicode êt pour cela deviner un encoding qui par défaut est "ASCII"... le "ê" n'étant pas ASCII çà plante.
    SI vous aviez mis:
    print file_unicode.encode('latin-1')
    Ca n'aurait peut être pas affiché le "ê" mais çà n'aurait pas remonté d'exception...

    J'avais également le problème pour des fonctions telles que os.rename(a, b) avec a et b en utf-8 accentués.
    Pour que çà fonctionne, il faut 'en plus' que le file system et l'OS supportent des noms utf-8...
    Mais la question est aussi a et b doivent-ils être "bytes" (utf-8) ou Unicode? Python 3 résout cette prise de tête là... mais pas les autres.
    - 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. Erreur sur SQLServer et pas sur Mysql
    Par legide dans le forum JDBC
    Réponses: 4
    Dernier message: 13/08/2009, 17h13
  2. Réponses: 1
    Dernier message: 31/05/2009, 22h54
  3. Réponses: 10
    Dernier message: 03/04/2009, 13h09
  4. Message d erreur qd je suis pas sur la bonne feuille
    Par johndeuf dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/12/2006, 22h58
  5. Réponses: 2
    Dernier message: 29/05/2006, 12h43

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