OVH Cloud OVH Cloud

question unicode

7 réponses
Avatar
Olivier Ravard
Bonjour à tous,

Je voudrais savoir quelle est la fonction sous python qui permet
de définir le type d'encodage par défaut de python.

J'ai déjà vu cette réponse dans ce newsgroup mais je n'arrive pas
à la retrouver. De plus je n'ai pas réussi à trouver cette info dans la
doc.

Merci de vos réponses...

O.R.

7 réponses

Avatar
Guillaume Bouchard
-Olivier Ravard wrote:
Bonjour à tous,


Bonjour

Je voudrais savoir quelle est la fonction sous python qui permet
de définir le type d'encodage par défaut de python.


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

par exemple, sur la premiere ou la deuxieme ligne.

Mais ce n'étais pas super dur à trouver ;o)

~/ $ echo "#è" > encodage.py
~/ $ python encodage.py
sys:1: DeprecationWarning: Non-ASCII character 'xe8' in file
encodage.py on line 1, but no encoding declared; see
http://www.python.org/peps/pep-0263.html for details

--
Guillaume.

Avatar
Eric Brunel
On Tue, 26 Apr 2005 12:47:09 +0200, Olivier Ravard wrote:

Bonjour à tous,

Je voudrais savoir quelle est la fonction sous python qui permet
de définir le type d'encodage par défaut de python.


Qu'est-ce que tu entends par "le type d'encodage par défaut"? Si c'est l'encodage dans lequel sont écrites les constantes chaine dans ton script, voir la réponse de Guillaume. Si c'est l'encodage qui sera automatiquement utilisé lorsque tu passes des chaines unicode à des fonctions qui attendent des chaines "normales", la réponse est plus compliquée:
- la fonction qui fait ça est setdefaultencoding dans le module sys (soit dit en passant, ça n'était pas vraiment difficile à trouver, le nom étant vraiment celui qu'on attend; un petit tour dans l'index du Library Reference et tu l'aurais trouvé tout de suite...)
- MAIS on ne peut pas l'utiliser comme on veut: vu que l'encodage n'est pas censé changer à tout bout de champ, cette fonction est censée etre appelée uniquement dans un script du personnalisation au niveau site (cf. http://docs.python.org/lib/module-site.html). En dehors d'un tel module, le nom n'est plus disponible dans le module sys et la fonction ne peut plus etre appelée.

Par ailleurs, en règle générale, utiliser cette fonction n'est pas une bonne idée. Python arrive en général assez bien à deviner quel encodage par défaut il peut utiliser, et meme s'il n'y arrive pas, se reposer sur l'encodage par défaut pour ne pas encoder soi-meme ses chaines comme ça va bien quand on en a besoin aura très souvent des conséquences... disons surprenantes...

Si tu nous expliques pourquoi tu crois avoir besoin de faire ça, peut-etre qu'on pourra mieux t'aider à comprendre comment t'en passer ;-)

HTH quand meme
--
python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"

Avatar
Olivier Ravard
"Eric Brunel" a écrit dans le message de news:

On Tue, 26 Apr 2005 12:47:09 +0200, Olivier Ravard
wrote:

Bonjour à tous,

Je voudrais savoir quelle est la fonction sous python qui permet
de définir le type d'encodage par défaut de python.


Qu'est-ce que tu entends par "le type d'encodage par défaut"? Si c'est
l'encodage dans lequel sont écrites les constantes chaine dans ton script,
voir la réponse de Guillaume. Si c'est l'encodage qui sera automatiquement
utilisé lorsque tu passes des chaines unicode à des fonctions qui
attendent des chaines "normales", la réponse est plus compliquée:
- la fonction qui fait ça est setdefaultencoding dans le module sys (soit
dit en passant, ça n'était pas vraiment difficile à trouver, le nom étant
vraiment celui qu'on attend; un petit tour dans l'index du Library
Reference et tu l'aurais trouvé tout de suite...)
- MAIS on ne peut pas l'utiliser comme on veut: vu que l'encodage n'est
pas censé changer à tout bout de champ, cette fonction est censée etre
appelée uniquement dans un script du personnalisation au niveau site (cf.
http://docs.python.org/lib/module-site.html). En dehors d'un tel module,
le nom n'est plus disponible dans le module sys et la fonction ne peut
plus etre appelée.

Par ailleurs, en règle générale, utiliser cette fonction n'est pas une
bonne idée. Python arrive en général assez bien à deviner quel encodage
par défaut il peut utiliser, et meme s'il n'y arrive pas, se reposer sur
l'encodage par défaut pour ne pas encoder soi-meme ses chaines comme ça va
bien quand on en a besoin aura très souvent des conséquences... disons
surprenantes...

Si tu nous expliques pourquoi tu crois avoir besoin de faire ça, peut-etre
qu'on pourra mieux t'aider à comprendre comment t'en passer ;-)



Merci. Je pense que ceci répond à ma question. Mon problème plus précis est
le suivant :
Je saisi des chaînes de caractères dans une interface (wxPython) et je met
le résultat dans une
base de données. La base de données n'accepte que des chaînes normale et wx
me renvoie
une chaîne où les caractères accentués sont remplacés par des x.. ou alors
une chaîne unicode
(selon la version de wx installée). Ensuite, je relis la base et je met le
résultat dans l'interface ou
l'on voit les accents remplcés par des x..

En fait, je pense que c'est un problème trivial pour ceux qui maîtrisent
l'unicode, ce qui n'est pas
mon cas. RTFM allez vous me dire. C'est ce que j'applique mais sans trop de
réussite dans ce cas.



HTH quand meme
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"



Avatar
Gilles Lenfant
"Eric Brunel" a écrit dans le message de news:


On Tue, 26 Apr 2005 12:47:09 +0200, Olivier Ravard
wrote:


Bonjour à tous,

Je voudrais savoir quelle est la fonction sous python qui permet
de définir le type d'encodage par défaut de python.


Qu'est-ce que tu entends par "le type d'encodage par défaut"? Si c'est
l'encodage dans lequel sont écrites les constantes chaine dans ton script,
voir la réponse de Guillaume. Si c'est l'encodage qui sera automatiquement
utilisé lorsque tu passes des chaines unicode à des fonctions qui
attendent des chaines "normales", la réponse est plus compliquée:
- la fonction qui fait ça est setdefaultencoding dans le module sys (soit
dit en passant, ça n'était pas vraiment difficile à trouver, le nom étant
vraiment celui qu'on attend; un petit tour dans l'index du Library
Reference et tu l'aurais trouvé tout de suite...)
- MAIS on ne peut pas l'utiliser comme on veut: vu que l'encodage n'est
pas censé changer à tout bout de champ, cette fonction est censée etre
appelée uniquement dans un script du personnalisation au niveau site (cf.
http://docs.python.org/lib/module-site.html). En dehors d'un tel module,
le nom n'est plus disponible dans le module sys et la fonction ne peut
plus etre appelée.

Par ailleurs, en règle générale, utiliser cette fonction n'est pas une
bonne idée. Python arrive en général assez bien à deviner quel encodage
par défaut il peut utiliser, et meme s'il n'y arrive pas, se reposer sur
l'encodage par défaut pour ne pas encoder soi-meme ses chaines comme ça va
bien quand on en a besoin aura très souvent des conséquences... disons
surprenantes...

Si tu nous expliques pourquoi tu crois avoir besoin de faire ça, peut-etre
qu'on pourra mieux t'aider à comprendre comment t'en passer ;-)




Merci. Je pense que ceci répond à ma question. Mon problème plus précis est
le suivant :
Je saisi des chaînes de caractères dans une interface (wxPython) et je met
le résultat dans une
base de données. La base de données n'accepte que des chaînes normale et wx
me renvoie
une chaîne où les caractères accentués sont remplacés par des x.. ou alors
une chaîne unicode
(selon la version de wx installée). Ensuite, je relis la base et je met le
résultat dans l'interface ou
l'on voit les accents remplcés par des x..

En fait, je pense que c'est un problème trivial pour ceux qui maîtrisent
l'unicode, ce qui n'est pas
mon cas. RTFM allez vous me dire. C'est ce que j'applique mais sans trop de
réussite dans ce cas.


Traîter l'Unicode est bien plus simple qu'il n'y parait. Faut pas s'en
faire une montagne. En fait, ce n'est pas plus compliqué que de
manipuler des chaînes 8 bits.

La plupart des frameworks modernes encouragent l'utilisation de
l'Unicode pour faciliter la localisation des applications.

Pour la base de données, le plus simple est d'utiliser un SGBDR qui
accepte de travailler directement en Unicode plutôt qu'avoir à s'emm...
à recoder les textes en latin1 (par exemple) pour chaque requête.





HTH quand meme
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"








Avatar
Do Re Mi chel La Si Do
Bonsoir !

Traiter l'Unicode est bien plus simple qu'il n'y parait.




C'est vrai à condition de se limiter aux possibilités de base d'unicode, de
ne pas utiliser d'encodages peu courants, de ne pas vouloir visualiser les
caractères, etc.
Dès que l'on veut faire une utilisation "avancée", ça accroche dur. Mais
Python est quand même parmi les langages les mieux placés.

Un seul exemple : utiliser une expression régulière qui contient des
caractères unicode "wide".


@-salutations
--
Michel Claveau



Avatar
Olivier Ravard
Traîter l'Unicode est bien plus simple qu'il n'y parait. Faut pas s'en
faire une montagne. En fait, ce n'est pas plus compliqué que de manipuler
des chaînes 8 bits.

La plupart des frameworks modernes encouragent l'utilisation de l'Unicode
pour faciliter la localisation des applications.

Pour la base de données, le plus simple est d'utiliser un SGBDR qui
accepte de travailler directement en Unicode plutôt qu'avoir à s'emm... à
recoder les textes en latin1 (par exemple) pour chaque requête.


Et concrètement, peut-on m'expliquer ce qui se passe dans l'exemple que
j'ai donné et comment résoudre le problème ?






HTH quand meme
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"








Avatar
Do Re Mi chel La Si Do
Bonjour !

Je ne pratique plus wxPython ; mais, si tu reçois une chaîne unicode, tu
peux essayer de l'encoder.

Par exemple (chu étant la chaîne unicode) :
chu.encode('utf-8','replace')
chu.encode('utf-16','replace')
chu.encode('cp1252','replace')

Évidemment, il faut connaître l'encodage accepté par le SGBD...


@-salutations
--
Michel Claveau