Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
u'ééééé'.encode('ascii')
Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
u'ééééé'.encode('ascii')
Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
u'ééééé'.encode('ascii')
On Jul 1, 8:08 am, Laurent FRANCOIS
wrote:Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
On Jul 1, 8:08 am, Laurent FRANCOIS<lau.franc...@worldonline.fr>
wrote:
Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:
u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
On Jul 1, 8:08 am, Laurent FRANCOIS
wrote:Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
On Jul 1, 8:08 am, Laurent FRANCOIS
wrote:Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
On Jul 1, 8:08 am, Laurent FRANCOIS<lau.franc...@worldonline.fr>
wrote:
Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:
u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
On Jul 1, 8:08 am, Laurent FRANCOIS
wrote:Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
tu as essayé :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
return u"<Movie: %s>" %(self.title)
Et ça marche?
Parce que chez moi ça ne marche pas.
Ni en script ni en interactif sur un terminal
ni en interactif avec PyCrust.
Merci
Mon editeur emacs 23
le coding :
Coding system for saving this buffer:
Not set locally, use the default.
Default coding system (for new files):
U -- utf-8-unix (alias: mule-utf-8-unix)
Coding system for keyboard input:
= -- no-conversion (alias: binary)
Coding system for terminal output:
nil
Coding system for inter-client cut and paste:
nil
Defaults for subprocess I/O:
decoding: U -- utf-8-unix (alias: mule-utf-8-unix)
encoding: U -- utf-8-unix (alias: mule-utf-8-unix)
et
$locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL >
On 07/01/2010 07:58 PM, eb303 wrote:On Jul 1, 8:08 am, Laurent FRANCOIS
wrote:Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
tu as essayé :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
return u"<Movie: %s>" %(self.title)
Et ça marche?
Parce que chez moi ça ne marche pas.
Ni en script ni en interactif sur un terminal
ni en interactif avec PyCrust.
Merci
Mon editeur emacs 23
le coding :
Coding system for saving this buffer:
Not set locally, use the default.
Default coding system (for new files):
U -- utf-8-unix (alias: mule-utf-8-unix)
Coding system for keyboard input:
= -- no-conversion (alias: binary)
Coding system for terminal output:
nil
Coding system for inter-client cut and paste:
nil
Defaults for subprocess I/O:
decoding: U -- utf-8-unix (alias: mule-utf-8-unix)
encoding: U -- utf-8-unix (alias: mule-utf-8-unix)
et
$locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL >
On 07/01/2010 07:58 PM, eb303 wrote:
On Jul 1, 8:08 am, Laurent FRANCOIS<lau.franc...@worldonline.fr>
wrote:
Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:
u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
tu as essayé :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
return u"<Movie: %s>" %(self.title)
Et ça marche?
Parce que chez moi ça ne marche pas.
Ni en script ni en interactif sur un terminal
ni en interactif avec PyCrust.
Merci
Mon editeur emacs 23
le coding :
Coding system for saving this buffer:
Not set locally, use the default.
Default coding system (for new files):
U -- utf-8-unix (alias: mule-utf-8-unix)
Coding system for keyboard input:
= -- no-conversion (alias: binary)
Coding system for terminal output:
nil
Coding system for inter-client cut and paste:
nil
Defaults for subprocess I/O:
decoding: U -- utf-8-unix (alias: mule-utf-8-unix)
encoding: U -- utf-8-unix (alias: mule-utf-8-unix)
et
$locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL >
On 07/01/2010 07:58 PM, eb303 wrote:On Jul 1, 8:08 am, Laurent FRANCOIS
wrote:Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
Le 02/07/2010 12:08, Laurent FRANCOIS a écrit :tu as essayé :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
return u"<Movie: %s>" %(self.title)
Et ça marche?
Parce que chez moi ça ne marche pas.
Ni en script ni en interactif sur un terminal
ni en interactif avec PyCrust.
Et non, ça ne marche pas.
Il semblerait qu'il y ait un bug à ce niveau.
Tout se comporte comme si repr() retournait un type byte string mais avec un contenu Unicode.
Tu as 2 solutions :
1) print "%s" % uins
2) Encoder les chaines de caractères dans __repr__():
#!/usr/bin/env python
# -*- coding: UTF8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
import sys
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
r = u"<Movie: %s>" %(self.title)
return r.encode(sys.stdout.encoding)
uins = Movie(u"ééééé")
print "%s" % uins
print Movie(u"ééééé")
Nicolas
Merci
Mon editeur emacs 23
le coding :
Coding system for saving this buffer:
Not set locally, use the default.
Default coding system (for new files):
U -- utf-8-unix (alias: mule-utf-8-unix)
Coding system for keyboard input:
= -- no-conversion (alias: binary)
Coding system for terminal output:
nil
Coding system for inter-client cut and paste:
nil
Defaults for subprocess I/O:
decoding: U -- utf-8-unix (alias: mule-utf-8-unix)
encoding: U -- utf-8-unix (alias: mule-utf-8-unix)
et
$locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL >>
On 07/01/2010 07:58 PM, eb303 wrote:On Jul 1, 8:08 am, Laurent FRANCOIS
wrote:Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
Le 02/07/2010 12:08, Laurent FRANCOIS a écrit :
tu as essayé :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
return u"<Movie: %s>" %(self.title)
Et ça marche?
Parce que chez moi ça ne marche pas.
Ni en script ni en interactif sur un terminal
ni en interactif avec PyCrust.
Et non, ça ne marche pas.
Il semblerait qu'il y ait un bug à ce niveau.
Tout se comporte comme si repr() retournait un type byte string mais avec un contenu Unicode.
Tu as 2 solutions :
1) print "%s" % uins
2) Encoder les chaines de caractères dans __repr__():
#!/usr/bin/env python
# -*- coding: UTF8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
import sys
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
r = u"<Movie: %s>" %(self.title)
return r.encode(sys.stdout.encoding)
uins = Movie(u"ééééé")
print "%s" % uins
print Movie(u"ééééé")
Nicolas
Merci
Mon editeur emacs 23
le coding :
Coding system for saving this buffer:
Not set locally, use the default.
Default coding system (for new files):
U -- utf-8-unix (alias: mule-utf-8-unix)
Coding system for keyboard input:
= -- no-conversion (alias: binary)
Coding system for terminal output:
nil
Coding system for inter-client cut and paste:
nil
Defaults for subprocess I/O:
decoding: U -- utf-8-unix (alias: mule-utf-8-unix)
encoding: U -- utf-8-unix (alias: mule-utf-8-unix)
et
$locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL >>
On 07/01/2010 07:58 PM, eb303 wrote:
On Jul 1, 8:08 am, Laurent FRANCOIS<lau.franc...@worldonline.fr>
wrote:
Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:
u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -
Le 02/07/2010 12:08, Laurent FRANCOIS a écrit :tu as essayé :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
return u"<Movie: %s>" %(self.title)
Et ça marche?
Parce que chez moi ça ne marche pas.
Ni en script ni en interactif sur un terminal
ni en interactif avec PyCrust.
Et non, ça ne marche pas.
Il semblerait qu'il y ait un bug à ce niveau.
Tout se comporte comme si repr() retournait un type byte string mais avec un contenu Unicode.
Tu as 2 solutions :
1) print "%s" % uins
2) Encoder les chaines de caractères dans __repr__():
#!/usr/bin/env python
# -*- coding: UTF8 -*-
# j'ai mis utf-8 à la place de ...
# mon editeur "emacs 23"
import sys
class Movie(object):
def __init__(self, title):
self.title = title
def __repr__(self):
r = u"<Movie: %s>" %(self.title)
return r.encode(sys.stdout.encoding)
uins = Movie(u"ééééé")
print "%s" % uins
print Movie(u"ééééé")
Nicolas
Merci
Mon editeur emacs 23
le coding :
Coding system for saving this buffer:
Not set locally, use the default.
Default coding system (for new files):
U -- utf-8-unix (alias: mule-utf-8-unix)
Coding system for keyboard input:
= -- no-conversion (alias: binary)
Coding system for terminal output:
nil
Coding system for inter-client cut and paste:
nil
Defaults for subprocess I/O:
decoding: U -- utf-8-unix (alias: mule-utf-8-unix)
encoding: U -- utf-8-unix (alias: mule-utf-8-unix)
et
$locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL >>
On 07/01/2010 07:58 PM, eb303 wrote:On Jul 1, 8:08 am, Laurent FRANCOIS
wrote:Bonjour,
J'ai un probleme de charset
J'ai pas mal lu sur l'unicode et autre charset.
j'ai pas tout compris sinon je serais pas là pour
poser une question.
Voila mon probleme.
class Movie(object):
... def __init__(self, title):
... self.title = title
... def __repr__(self):
... return "<Movie: %s>" %(self.title)
...
>>> ins = Movie("ééééé")
>>> ins
<Movie: ééééé>
>>> uins = Movie(u"ééééé")
>>> uins
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
8-12: ordinal not in range(128)
>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.version
'2.5.5 (r255:77872, Apr 21 2010, 08:40:04) n[GCC 4.4.3]'
Assez simple en fait: quand tu demandes d'afficher uins, Python
appelle __repr__, qui fait "<Movie: %s>" %(self.title), et self.title
est une chaîne unicode. Vu que<Movie: %s>" n'en est pas une, Python
va essayer de représenter self.title en "byte string" pour pouvoir la
rentrer dans le %s, ce pour quoi il doit l'encoder. L'encodage par
défaut étant ASCII, il va faire en gros self.title.encode('ascii'), ce
qui évidemment ne fonctionne pas vu que self.title contient des
caractères accentués qui ne sont pas dans le jeu de caractère ASCII.
En fait, au final, Python fera:u'ééééé'.encode('ascii')
Ce qui donne ce que tu as vu:
Traceback (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-4: ordinal not in range(128)
Voilà pour le problème. Pour la solution, c'est une autre histoire, et
ça dépend de ce que tu veux faire en fait. La première chose serait de
passer toutes tes chaînes en chaînes unicode, et donc de modifier la
méthode __repr__ comme ça:
def __repr__(self):
return u"<Movie: %s>" %(self.title)
De cette façon, pas d'encodage quand self.title sera une chaîne
Unicode: elle rentre toute seule dans le %s. Dans ce cas précis, ça ne
posera pas de problème, vu que "<Movie: %s>" ne contient que des
caratères ASCII. Par contre, si tu essaies d'utiliser autre chose,
genre u'ééééé', voilà ce qui se passera quand tu lanceras ton
programme:
File "toto.py", line 1
SyntaxError: Non-ASCII character 'xc3' in file toto.py on line 1, but
no encoding declared; see http://www.python.org/peps/pep-0263.html for
details
Ce qui se passe ici, c'est que tu as une chaîne unicode contenant des
caractères non-ASCII. Ces caractères sont encodés avec un certain
encodage dans ton fichier, décidé probablement par ton éditeur de code
source; mais Python n'a aucune idée de ce que c'est. Vu qu'essayer de
deviner n'est pas dans la philosophie du langage, il préfère s'arrêter
tout de suite et te renvoyer une erreur de syntaxe. La solution est
d'indiquer à Python l'encodage de tes fichiers sources à l'aide de la
ligne magique:
# -*- coding: … -*-
à placer en début de fichier. Bien sûr, remplacer les … par l'encodage
par défaut de ton éditeur préféré (que je ne connais pas, donc je ne
peux pas t'aider là-dessus). Et je te conseille la lecture de la page
citée dans l'erreur ci-dessus (http://www.python.org/peps/
pep-0263.html).
L'autre solution, c'est de passer à Python 3, et là toutes tes chaînes
seront des chaînes unicode par défaut et tu n'auras plus à tout
préfixer par des u partout. Mais ça ne changera rien à la nécessité de
déclarer ton encodage dans tes sources…
J'espère que c'est un peu plus clair.
- Eric -