Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

resultat différent si IDLE ou terminal

9 réponses
Avatar
Laurent FRANCOIS
je ne comprends pas pourquoi

dans un terminal j'obtiens ceci:
--------
Python 2.6.5+ (release26-maint, Jun 16 2010, 09:20:52)
[GCC 4.4.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> def F(x):
... return "[%s]" %(x.encode('utf8'))
...
>>> F(u"é")
'[\xc3\xa9]'
>>> print F(u"é")
[é]
-------
Et avec IDLE ou Pycrust j'obtiens pour la
même fonction et le même argument:

Python 2.6.5+ (release26-maint, Jun 16 2010, 09:20:52)
[GCC 4.4.4] on linux2
Type "copyright", "credits" or "license()" for more information.

>>> def F(x):
return "[%s]" %(x.encode('utf8'))
>>> F(u"é")
'[\xc3\x83\xc2\xa9]'
>>> print F(u"é")
[é]
---------

sys.stdout.encoding et sys.stdin.encoding = UTF-8 dans tous les cas

Pourquoi est-ce que la valeur retournée par F est si différente?
Je comprends tres bien la différence dans le print.

Vous savez comment je peux me débarrasser de cette différence?
Ne me dites pas de passer en 3 car je ne peux. Je voudrais continuer
à utiliser wxpython qui n'est pas pret d'être en 3 si j'ai bien compris.

Merci


--
Laurent FRANCOIS

9 réponses

Avatar
NicolasP
Le 13/07/2010 15:01, Laurent FRANCOIS a écrit :
je ne comprends pas pourquoi

dans un terminal j'obtiens ceci:
--------
Python 2.6.5+ (release26-maint, Jun 16 2010, 09:20:52)
[GCC 4.4.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> def F(x):
... return "[%s]" %(x.encode('utf8'))
...
>>> F(u"é")
'[xc3xa9]'
>>> print F(u"é")
[é]
-------
Et avec IDLE ou Pycrust j'obtiens pour la
même fonction et le même argument:

Python 2.6.5+ (release26-maint, Jun 16 2010, 09:20:52)
[GCC 4.4.4] on linux2
Type "copyright", "credits" or "license()" for more information.

>>> def F(x):
return "[%s]" %(x.encode('utf8'))
>>> F(u"é")
'[xc3x83xc2xa9]'
>>> print F(u"é")
[é]
---------

sys.stdout.encoding et sys.stdin.encoding = UTF-8 dans tous les cas

Pourquoi est-ce que la valeur retournée par F est si différente?
Je comprends tres bien la différence dans le print.

Vous savez comment je peux me débarrasser de cette différence?
Ne me dites pas de passer en 3 car je ne peux. Je voudrais continuer
à utiliser wxpython qui n'est pas pret d'être en 3 si j'ai bien compris.

Merci





As tu vérifié que les encodages de la console et de IDLE correspondent à ce que donne sys.stdout.encoding ?

Nicolas
Avatar
Laurent FRANCOIS
On 07/28/2010 11:38 PM, NicolasP wrote:

[snip]
sys.stdout.encoding et sys.stdin.encoding = UTF-8 dans tous les cas

Pourquoi est-ce que la valeur retournée par F est si différente?
Je comprends tres bien la différence dans le print.

Vous savez comment je peux me débarrasser de cette différence?
Ne me dites pas de passer en 3 car je ne peux. Je voudrais continuer
à utiliser wxpython qui n'est pas pret d'être en 3 si j'ai bien compris.

Merci





As tu vérifié que les encodages de la console et de IDLE correspondent à
ce que donne sys.stdout.encoding ?

Nicolas



Oui bien sur je l'ai dans mon mail d'ailleurs.

sys.stdout.encoding et sys.stdin.encoding = UTF-8 dans tous les cas


--
Laurent FRANCOIS
Avatar
NicolasP
Le 11/08/2010 13:43, Laurent FRANCOIS a écrit :
On 07/28/2010 11:38 PM, NicolasP wrote:

[snip]
sys.stdout.encoding et sys.stdin.encoding = UTF-8 dans tous les cas

Pourquoi est-ce que la valeur retournée par F est si différente?
Je comprends tres bien la différence dans le print.

Vous savez comment je peux me débarrasser de cette différence?
Ne me dites pas de passer en 3 car je ne peux. Je voudrais continuer
à utiliser wxpython qui n'est pas pret d'être en 3 si j'ai bien compris.

Merci





As tu vérifié que les encodages de la console et de IDLE correspondent à
ce que donne sys.stdout.encoding ?

Nicolas



Oui bien sur je l'ai dans mon mail d'ailleurs.



J'ai bien lu.

sys.stdout.encoding et sys.stdin.encoding = UTF-8 dans tous les cas




Mais dans la réalité, est-ce que la console et IDLE utilisent bien utf-8 ?
Est-ce que sys.stdout.encoding et sys.stdin.encoding donnent les bonnes informations dans tous les cas ?
Avatar
Francois Lafont
Le 11/08/2010 14:09, NicolasP a écrit :

Mais dans la réalité, est-ce que la console et IDLE utilisent bien utf-8 ?
Est-ce que sys.stdout.encoding et sys.stdin.encoding donnent les bonnes
informations dans tous les cas ?



C'est possible que Python se trompe ?

En tous cas, c'est l'impression qu'on a en effet, car la chaine 'é'
c'est exactement ce qu'affiche un éditeur de texte paramétré pour lire
du latin1, alors qu'il est en réalité en train de lire la chaîne 'é'
encodée en utf8.

Et tant qu'on y est, que donne ceci ?

print u'é'
print '%s' %u'é'.encode('utf8')


--
François Lafont
Avatar
NicolasP
Le 11/08/2010 21:59, Francois Lafont a écrit :
Le 11/08/2010 14:09, NicolasP a écrit :

Mais dans la réalité, est-ce que la console et IDLE utilisent bien utf-8 ?
Est-ce que sys.stdout.encoding et sys.stdin.encoding donnent les bonnes
informations dans tous les cas ?



C'est possible que Python se trompe ?



Il n'y a pas de raison pour que Python se trompe mais rien n'est impossible.

D'ailleurs, la bonne écriture de la fonction serait plutôt celle-ci :

import sys
def F(x):
return "[%s]" %(x.encode(sys.stdout.encoding))

De cette façon, quel que soit l'encodage de la console, l'affichage est toujours bon.

En tous cas, c'est l'impression qu'on a en effet, car la chaine 'é'
c'est exactement ce qu'affiche un éditeur de texte paramétré pour lire
du latin1, alors qu'il est en réalité en train de lire la chaîne 'é'
encodée en utf8.

Et tant qu'on y est, que donne ceci ?

print u'é'
print '%s' %u'é'.encode('utf8')



Là aussi, la bonne syntaxe est plutôt : print '%s' %u'é'.encode(sys.stdout.encoding)

Nicolas
Avatar
Laurent FRANCOIS
En idle
print u"é"






é
print "%s" %u"é".encode('utf8')






é

Dans un terminal:
print u"é"






é
print "%s" %u"é".encode('utf8')






é









--
Laurent FRANCOIS


On 08/12/2010 06:59 AM, Francois Lafont wrote:
Et tant qu'on y est, que donne ceci ?

print u'é'
print '%s' %u'é'.encode('utf8')


Avatar
Laurent FRANCOIS
On 08/12/2010 05:42 PM, NicolasP wrote:

D'ailleurs, la bonne écriture de la fonction serait plutôt celle-ci :

import sys
def F(x):
return "[%s]" %(x.encode(sys.stdout.encoding))

De cette façon, quel que soit l'encodage de la console, l'affichage est
toujours bon.





Toujours bon?

#Avec idle:
def F(x):






return "%s" %(x.encode(sys.stdout.encoding))

F(u"é")






'xc3x83xc2xa9'
print F(u"é")






é


# Dans un terminal

import sys
def F(x):






... return '%s' %(x.encode(sys.stdout.encoding))
...
F(u"é")






'xc3xa9'
print F(u"é")






é

------------------
D'ailleurs pour moi je suis pas un expert en python mais
sys.stdout.encoding = A alors %(x.encode(sys.stdout.encoding))
et %(x.encode(A)) c'est bonnet blanc blanc bonnet.

Alors qu'est ce que tu veux nous faire comprendre NicolasP?

-------
F(x) retourne une str. On est d'accord?
Pourquoi elle est différente? Problème d'encodage. D'accord.
Mais sys.stdout.encoding est le meme dans le terminal et dans IDLE.

Question: C'est quoi cet encodage: 'xc3x83xc2xa9' pour é? Du latin-1?


dans IDLE
def F(x):






return '%s' %(x.encode('latin-1'))

F(u"é")






'xc3xa9'
print F(u"é")






é

dans un terminal
def F(x):






... return '%s' %(x.encode('latin-1'))
...
F(u"é")






'xe9'
print F(u"é")









J'ai l'impression d'être près du but mais je n'arrive pas
finir le travail.



Laurent FRANCOIS
Avatar
Alain Ketterlin
Laurent FRANCOIS writes:

>>> def F(x):
return "%s" %(x.encode(sys.stdout.encoding))

#Avec idle:
F(u"é")






'xc3x83xc2xa9'
print F(u"é")






é

# Dans un terminal
F(u"é")






'xc3xa9'
print F(u"é")






é



Le problème est dans ce que tu entres. En résumé : quand tu écris u"é",
python construit une chaîne unicode (une liste de code-points) à partir
de ce qui apparaît littéralement entre les double-quotes. Mais po ur ça
il doit le comprendre. Selon la config du terminal/de idle, il ne verra
pas la même chose. Pour tester cela, tape simplement

u"é"

Normalement, la réponse devrait être u'xe9' (à savoir une c haîne
unicode de un code-point de valeur e9) si tout est bien configuré,
c'est-à-dire si l'interpréteur python ne se trompe pas sur ce qui se
trouve entre les double-quotes. Dans le cas précédent, dans un te rminal
utf-8, l'interpréteur python reçoit les _octets_ 75 22 c3 a9 22. (22
c'est la double quote.) Il "voit" donc un caractère utf-8 codé c3 a9 (le
é), qu'il transforme en code-point (e9).

Si l'interpréteur pensait être en latin-1, il verrait deux caract ères
entre les doubles quotes : d'abord c3 (LATIN CAPITAL LETTER A WITH
TILDE) puis a9 (COPYRIGHT SIGN). Il composerait alors la chaine unicode
composée de deux code-points (c3 puis a9). Ensuite, au moment du
encode(), il devrait traduire ces deux code-points en octets selon le
codage utf-8. Et là, le _caractère_ c3 devient les deux _octets_ c3 83,
et le _caractère_ a9 devient les deux _octets_ c2 a9.

Question: C'est quoi cet encodage: 'xc3x83xc2xa9' pour é? Du lat in-1?



D'une certaine façon. C'est une entrée utf-8 lue comme du latin1 puis
convertie en utf-8.

A mon avis, idle pense vivre en latin1 (pour ce qui est de l'entrée). Il
y a quelque chose qui cloche à un moment. Vérifie sys.input.encod ing.

-- Alain.

P/S: note que dans un fichier source python, tu ne peux pas utiliser des
caractères non-ascii sans avoir au préalable indiqué en dà ©but de fichier
le codage d'entrée utilisé (iso-8859-1 ou utf-8, ou...). Par dà ©faut
c'est de l'ascii (depuis je ne sais plus quelle version). Ensuite, à t oi
de veiller que ton éditeur est d'accord avec toi.
Avatar
NicolasP
Le 13/08/2010 14:31, Laurent FRANCOIS a écrit :
On 08/12/2010 05:42 PM, NicolasP wrote:

D'ailleurs, la bonne écriture de la fonction serait plutôt celle-ci :

import sys
def F(x):
return "[%s]" %(x.encode(sys.stdout.encoding))

De cette façon, quel que soit l'encodage de la console, l'affichage est
toujours bon.





Toujours bon?



Toujours bon si sys.stdout.encoding est bien défini.


#Avec idle:
>>> def F(x):
return "%s" %(x.encode(sys.stdout.encoding))

>>> F(u"é")
'xc3x83xc2xa9'
>>> print F(u"é")
é


# Dans un terminal

>>> import sys
>>> def F(x):
... return '%s' %(x.encode(sys.stdout.encoding))
...
>>> F(u"é")
'xc3xa9'
>>> print F(u"é")
é

------------------
D'ailleurs pour moi je suis pas un expert en python mais
sys.stdout.encoding = A alors %(x.encode(sys.stdout.encoding))
et %(x.encode(A)) c'est bonnet blanc blanc bonnet.

Alors qu'est ce que tu veux nous faire comprendre NicolasP?




Dans ton post de départ, il est écrit :
def F(x):
return "[%s]" %(x.encode('utf8'))

Donc, tu codé en dur que l'encodage des chaines est de type utf8.
Et si la console n'a pas cet encodage, l'affichage n'est pas bon.

Je t'explique donc qu'il vaut mieux écrire
def F(x):
return "[%s]" %(x.encode(sys.stdout.encoding))

De cette façon, l'encodage de tes chaines de caractères sera égal à celui de la console.

Au cas où je n'aurais pas été assez clair, c'est Python qui initialise sys.stdout.encoding, pas l'utilisateur. Si tu changes la valeur de sys.stdout.encoding, l'encodage utilisé par la console ne changera pas.
Par exemple, sur ma machine qui tourne sous WinXp, dans la console IDLE, j'obtiens :

IDLE 1.2.4
import sys

sys.stdout.encoding






'cp1252'

def F(x):






return "[%s]" %(x.encode(sys.stdout.encoding))

print F(u"é")






[é]
sys.stdout.encoding="utf8"
print F(u"é")






[é]






-------
F(x) retourne une str. On est d'accord?
Pourquoi elle est différente? Problème d'encodage. D'accord.
Mais sys.stdout.encoding est le meme dans le terminal et dans IDLE.



Si tu es sous Windows, ça m'étonnerais que IDLE et un terminal utilisent le même encodage.
Sur ma machine :
IDLE : cp1252
terminal : cp850

Nicolas