OVH Cloud OVH Cloud

Python et les accents

32 réponses
Avatar
nico
Bonjour,

Lorsque je mets des accents dans mes chaines de caractères, j'ai un warning généré par python. Normal.
J'aimerais supprimer ce warning mais je n'y arrive pas.
Je suis sous windows. J'utilise Eclipse 3.1 avec le plug-in PyDev.
Je mets le commentaire qui va bien au début de mon fichier pour dire que j'ai des caractères de type UTF-8. J'enregistre mon fichier au format UTF-8 (ou du moins je pense que c'est le cas). J'ai bien mes caractères accentués dans le fichier source mais à l'exécution j'ai 2 caractères bizarres à chaque lettre accentuée. Je suppose que ces deux caractères correspondent au code UTF-8 non "décodé". Ce qui est étrange c'est que dès que je mets le commentaire de type d'encodage au début du fichier, Eclipse sauvegarde automatiquement le fichier dans le nouvel encodage. Comme si Eclipse connaissait cette "instruction". Peut-être que c'est PyDev qui fait ça ?
Quelqu'un a t-il déjà eu ce genre problème ? Et éventuellement une solution ?

Nicolas

10 réponses

1 2 3 4
Avatar
Hervé Cauwelier
dès que je mets le commentaire de type d'encodage au début du fichier,
Eclipse sauvegarde automatiquement le fichier dans le nouvel encodage.
Comme si Eclipse connaissait cette "instruction". Peut-être que c'est
PyDev qui fait ça ?


Le format dans lequel est écrit le codage de caractères est une
convention aussi connue de vim et emacs.

Quelqu'un a t-il déjà eu ce genre problème ? Et éventuellement une
solution ?


Il y a longtemps, à l'école, quand j'écrivais des programmes C qui
imprimait des accents dans un terminal "DOS" sous Windows. :-)

Je ne me souviens pas pour un script Python exécuté dans la même console
de m***e mais il est possible que ce vieil âne têtu n'en fasse qu'à sa
tête et refuse de prendre autre chose en compte que son codage de
caractères propriétaire, dont le nom pour Python doit être windows-1252
ou cp-1252. Problème de portabilité en vue si tu l'utilises...

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
nico

dès que je mets le commentaire de type d'encodage au début du fichier,
Eclipse sauvegarde automatiquement le fichier dans le nouvel encodage.
Comme si Eclipse connaissait cette "instruction". Peut-être que c'est
PyDev qui fait ça ?



Le format dans lequel est écrit le codage de caractères est une
convention aussi connue de vim et emacs.


Après un peu de recherches, c'est PyDev (version récente) qui fait le changement automatique d'encodage.


Quelqu'un a t-il déjà eu ce genre problème ? Et éventuellement une
solution ?



Il y a longtemps, à l'école, quand j'écrivais des programmes C qui
imprimait des accents dans un terminal "DOS" sous Windows. :-)

Je ne me souviens pas pour un script Python exécuté dans la même console
de m***e mais il est possible que ce vieil âne têtu n'en fasse qu'à sa
tête et refuse de prendre autre chose en compte que son codage de
caractères propriétaire, dont le nom pour Python doit être windows-1252
ou cp-1252. Problème de portabilité en vue si tu l'utilises...

Oui mais je suis sous Windows et ça je n'y peut rien. Donc je cherche une solution.



Avatar
noone
Bonjour,

Lorsque je mets des accents dans mes chaines de caractères, j'ai un
warning généré par python. Normal.
J'aimerais supprimer ce warning mais je n'y arrive pas.
Je suis sous windows. J'utilise Eclipse 3.1 avec le plug-in PyDev.
Je mets le commentaire qui va bien au début de mon fichier pour dire que
j'ai des caractères de type UTF-8. J'enregistre mon fichier au format
UTF-8 (ou du moins je pense que c'est le cas). J'ai bien mes caractères
accentués dans le fichier source mais à l'exécution j'ai 2 caractères
bizarres à chaque lettre accentuée. Je suppose que ces deux caractères
correspondent au code UTF-8 non "décodé". Ce qui est étrange c'est que
dès que je mets le commentaire de type d'encodage au début du fichier,
Eclipse sauvegarde automatiquement le fichier dans le nouvel encodage.
Comme si Eclipse connaissait cette "instruction". Peut-être que c'est
PyDev qui fait ça ?
Quelqu'un a t-il déjà eu ce genre problème ? Et éventuellement une
solution ?

Nicolas



tu as bien mis ça au début de ton code source

# -*- coding: iso-8859-1 -*-

(tu peux remplacer iso-8859-1 par l'encodage qui tu utilises (utf-8,
windows-1252, cp-1252)

Je te conseille d'installer Cygwin sur ton PC et de regarder l'encodage
avec la fonction "file"... le modifier avec "iconv" ou "recode"

Avatar
Laurent Pointal
nico wrote:
Bonjour,

Lorsque je mets des accents dans mes chaines de caractères, j'ai un
warning généré par python. Normal.
J'aimerais supprimer ce warning mais je n'y arrive pas.


:-) collision de sujet entre python-fr et fclp :-)

pythonfr: http://www.aful.org/wws/info/python

Je me cite:
---------------------------------------------------------------------
Mais c'est quoi la "chaîne python classique" ?


C'est la chaine de type str, qui utilise l'encodage par défaut
(sys.getdefaultencoding). Donc généralement l'ASCII..

sys.getdefaultencoding()
'ascii'







(sauf erreur il est fortement conseillé de laisser l'encodage en ASCII
car c'est global, et certains modules peuvent ne pas apprécier si l'on
change).


Personnellement je fais souvent l'erreur suivante

- je déclare un # -*- coding: latin1 -*- au début de mon module.
- l'encode effectivement mon source en latin1
- je déclare des chaînes standard str (via "blabla"), qui contiennent
effectivement des caractères encodés en latin1.

Mais... pour Python, comme les chaînes ne sont pas déclarées unicode
(via u"blabla"), elles sont donc des chaînes dans l'encodage par
défaut... donc l'ascii. Et lorsque je veux afficher des caractères, je
me retrouve avec des caractères de l'espace latin1 (>127) dans des
chaînes censées être de l'ASCII donc Python me lève de jolies exceptions.

Solution (pour les encodages de chaînes dans les sources):
- je déclare un # -*- coding: latin1 -*- au début de mon module.
- l'encode effectivement mon source en latin1
- je déclare des chaînes unicode, que Python crée automatiquement à
partir du source qu'il sait être encodé en latin1.

Et lorsque je veux ressortir ces chaînes, je fais du
s.encode(l'encodagequejeveux).

Et donc, solution lorsque je lis ou écrit du texte: savoir dans quel
encodage il est, et travailler de façon interne avec de l'unicode.

---------------------------------------------------------------------


A+

Laurent.






Avatar
Hervé Cauwelier
- je déclare des chaînes unicode, que Python crée automatiquement à
partir du source qu'il sait être encodé en latin1.

Et lorsque je veux ressortir ces chaînes, je fais du
s.encode(l'encodagequejeveux).


Je pense que c'est le comportement le plus sain et le plus pérenne. Il
me semble même avoir lu que c'était une piste pour l'évolution de Python
: distinguer les chaînes « flux d'octets » pour les sources de données
et les constantes littérales du code, et les chaînes de caractères texte
à destination des humains.

Un outil que j'utilise fait cette distinction pour savoir quelles
chaînes sont à extraire dans un fichier PO pour traduction et lesquelles
sont à usage interne.

Et donc, solution lorsque je lis ou écrit du texte: savoir dans quel
encodage il est, et travailler de façon interne avec de l'unicode.


C'est de toute façon indispensable. Comment peut-on programmer sans
savoir dans quel codage on lit et écrit, on stocke ses données, et on
lit les données des autres ? Une référence en français sur le sujet :
http://french.joelonsoftware.com/Articles/Unicode.html

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
nico



tu as bien mis ça au début de ton code source

# -*- coding: iso-8859-1 -*-


J'ai essayé avec UTF-8 et Cp-1252 sans succès.


(tu peux remplacer iso-8859-1 par l'encodage qui tu utilises (utf-8,
windows-1252, cp-1252)

Je te conseille d'installer Cygwin sur ton PC et de regarder l'encodage
avec la fonction "file"... le modifier avec "iconv" ou "recode"


Avatar
nico


C'est la chaine de type str, qui utilise l'encodage par défaut
(sys.getdefaultencoding). Donc généralement l'ASCII..


sys.getdefaultencoding()







'ascii'

(sauf erreur il est fortement conseillé de laisser l'encodage en ASCII
car c'est global, et certains modules peuvent ne pas apprécier si l'on
change).


Personnellement je fais souvent l'erreur suivante

- je déclare un # -*- coding: latin1 -*- au début de mon module.
- l'encode effectivement mon source en latin1
- je déclare des chaînes standard str (via "blabla"), qui contiennent
effectivement des caractères encodés en latin1.

Mais... pour Python, comme les chaînes ne sont pas déclarées unicode
(via u"blabla"), elles sont donc des chaînes dans l'encodage par
défaut... donc l'ascii. Et lorsque je veux afficher des caractères, je
me retrouve avec des caractères de l'espace latin1 (>127) dans des
chaînes censées être de l'ASCII donc Python me lève de jolies exceptions.

Solution (pour les encodages de chaînes dans les sources):
- je déclare un # -*- coding: latin1 -*- au début de mon module.
- l'encode effectivement mon source en latin1
- je déclare des chaînes unicode, que Python crée automatiquement à
partir du source qu'il sait être encodé en latin1.

Et lorsque je veux ressortir ces chaînes, je fais du
s.encode(l'encodagequejeveux).

Et donc, solution lorsque je lis ou écrit du texte: savoir dans quel
encodage il est, et travailler de façon interne avec de l'unicode.

Tiens, ça me fais penser que le problème est peut-être ailleurs. J'utilise wxPython comme interface graphique pour mon programme. Et c'est dans les affichages de mon programme que ça va pas. Et je me rapelle avoir installé la version non unicode de wxPython (en me demandant à quoi pouvait bien servir une version unicode).

Et si j'installais une version unicode de wxPython...


Merci pour la solution complète. Je ne pensais pas que ça serait si compliqué de mettre des accents dans un programme ;)

Nicolas


---------------------------------------------------------------------


A+

Laurent.








Avatar
Do Re Mi chel La Si Do
Bonjour !


Je suis d'accord : les deux caractères correspondent bien à de l'UTF-8
"non-décodés" ; disons traités comme de l'ANSI ou de l'ASCII brut.

Ce qu'il faut, c'est que ta sortie traite l'UTF-8. Alors, question : comment
visualises-tu le résultat de tes scripts ?

Si c'est la console, problème, elle ne gère pas l'UTF-8 ; il faut alors
revenir au cp1252, utiliser la commande "CHCP 1252" pour dire à la console
de se mettre en cp1252, et, éventuellement, changer la police, dans les
propriétés de la console.

Si tu utilises une console virtuelle (par exemple avec SCite), il faut
vérifier ses paramètres, et la police de caractères utilisée. Je conseille
Arial Unicode, qui peut représenter plus de 56 000 caractères unicode.

Si tu utilises un GUI (wx, tk, etc.), il faut vérifier que tu utilises bien
une version unicode.

Si tu utilises les API de windows, (avec ctypes ou pywin32), il suffit de
choisir les version unicode, et il ne devrait pas y avoir de problème.


Perso, je travaille en cp1252 pour tout ce qui console, et en UTF-8 pour les
gros script, à cause d'un bug de Python 2.4 et 2.4.1 (sur les grandes lignes
en cp1252). Alors, dans le cas de l'UTF-8 en console, je convertis la sortie
en cp1252 (1).


J'espère que ces indications aideront...



@-salutations

Michel Claveau




(1) en fait, je n'utilise pas que cp1252, mais aussi cp1251 (Russie), cp1250
(Europe centrale), et cp1253 (Grèce), selon les besoins. Tous fonctionnent
bien sous windows.
Avatar
noone
Je te conseille d'installer Cygwin sur ton PC et de regarder l'encodage
avec la fonction "file"... le modifier avec "iconv" ou "recode"



et vous savez quel est l'encodage du fichier que vous utiliser
(en testant avec file)

Je pense que je mieux est d'utiliser un éditeur de texte digne de ce nom
(Emacs par exemple tourne bien sous Windows)


Avatar
Do Re Mi chel La Si Do
Bonjour !

J'ai des doutes sur l'information renvoyée. Comment cet utilitaire
distinguera-t'il un fichier en cp1252, d'un fichier en cp1251, ou d'un
fichier unicode, si l'identifiant manque ? D'après Unicode, en l'absence
d'en-tête, ce devrait être de l'UTF-8 ; cela n'est pas toujours vrai...

@-salutations

Michel Claveau
1 2 3 4