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 averti
    Profil pro
    �tudiant
    Inscrit en
    Mars 2006
    Messages
    24
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    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
    Membre averti
    Homme Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    33
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 56
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 33
    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 exp�riment�
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    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 averti
    Profil pro
    �tudiant
    Inscrit en
    Mars 2006
    Messages
    24
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    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
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 775
    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 775
    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