OVH Cloud OVH Cloud

Utf8 Python

5 réponses
Avatar
pasdespam-stealth
Bonjour,

Dans un programme en python j'utilise des commandes Unix avec popen (je
suis obligé de faire ainsi car je lance les commandes à distance avec
ssh, les machines n'ayant pas python) .

Sur certaines machines j'ai des messages d'erreurs à cause de mon
interface en PyGTK qui utilise UTF8.

J'essaye donc de convertir le resultat de mes commandes en UTF8
mais ....

info = os.popen("ls -la")
text = info.read()
text.encode('utf8')
buffer = self.textview1.get_buffer()
buffer.set_text(text)

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 91-93:
invalid data

J'ai lancé cette commande directement sur une machine qui me pose probleme.

Comme forcer la conversion en UTF8 ?

Merci d'avance

--
Posté via http://www.webatou.net/
Usenet dans votre navigateur !
Complaints-To: abuse@webatou.net

5 réponses

Avatar
Encolpe DEGOUTE
Dans fr.comp.lang.python, Frederic-B écrivit:
Bonjour,

Dans un programme en python j'utilise des commandes Unix avec popen (je
suis obligé de faire ainsi car je lance les commandes à distance avec
ssh, les machines n'ayant pas python) .

Sur certaines machines j'ai des messages d'erreurs à cause de mon
interface en PyGTK qui utilise UTF8.

J'essaye donc de convertir le resultat de mes commandes en UTF8
mais ....

info = os.popen("ls -la")
text = info.read()
text.encode('utf8')
buffer = self.textview1.get_buffer()
buffer.set_text(text)

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 91-93:
invalid data

J'ai lancé cette commande directement sur une machine qui me pose probleme.

Comme forcer la conversion en UTF8 ?


text.encode('utf8', 'ignore')
ou cet exemple d'interaction avec le système:
word = self.entry.get_text ()
os.environ['WORD'] = word.encode('iso-8859-15', 'ignore')
words = os.popen ('grep "^${WORD}$" /usr/share/dict/words | recode l9..u8').read ()

--
Encolpe DEGOUTE
http://colpi.info
Logiciels libres, hockey sur glace et autres activités cérébrales

Avatar
pasdespam-stealth
Encolpe DEGOUTE wrote:


Comme forcer la conversion en UTF8 ?


text.encode('utf8', 'ignore')
ou cet exemple d'interaction avec le système:
word = self.entry.get_text ()
os.environ['WORD'] = word.encode('iso-8859-15', 'ignore')
words = os.popen ('grep "^${WORD}$" /usr/share/dict/words | recode
l9..u8').read ()


Bonjour et merci,

Mais malheuresement ....

line 429, in erase
text.encode('utf8','ignore')
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 91-93:
invalid d ata

Est-il possible de passer outre les caracteres invalides ?



--
Posté via http://www.webatou.net/
Usenet dans votre navigateur !
Complaints-To:


Avatar
Sylvain Thenault
On Fri, 09 Jul 2004 06:58:59 +0000, Frederic-B wrote:

Encolpe DEGOUTE wrote:


Comme forcer la conversion en UTF8 ?


text.encode('utf8', 'ignore')
ou cet exemple d'interaction avec le système: word >> self.entry.get_text ()
os.environ['WORD'] = word.encode('iso-8859-15', 'ignore') words >> os.popen ('grep "^${WORD}$" /usr/share/dict/words | recode
l9..u8').read ()


Bonjour et merci,

Mais malheuresement ....

line 429, in erase
text.encode('utf8','ignore')
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 91-93:
invalid d ata


ton problème c'est que tu essaies d'encoder en UTF-8 une chaine encodé
en latin-1. Python essaie donc d'abord de passer ta chaine latin1 en
objet unicode en utilisant l'encodage par défaut, ascii. L'erreur se
passe donc avant l'encodage en UTF-8 (d'où l'erreur UnicodeDecodeError,
et non UnicodeEncodeError).
ça devrait aller mieux si tu fais :

text = unicode(text, 'ISO-8859-1').encode('UTF-8')

et hop ! comme ça tu perd même pas les accents (pour moi quand on
commence à donner la politique 'ignore' à la méthode encode, ça montre
généralement problème. Le seul cas acceptable, c'est quand on ne
connait pas l'encodage de la chaine de départ, ce qui n'est pas ton cas
ici)

--
Sylvain Thénault LOGILAB, Paris (France).

http://www.logilab.com http://www.logilab.fr http://www.logilab.org



Avatar
pasdespam-stealth
ton problème c'est que tu essaies d'encoder en UTF-8 une chaine encodé
en latin-1. Python essaie donc d'abord de passer ta chaine latin1 en
objet unicode en utilisant l'encodage par défaut, ascii. L'erreur se
passe donc avant l'encodage en UTF-8 (d'où l'erreur UnicodeDecodeError,
et non UnicodeEncodeError).
ça devrait aller mieux si tu fais :

text = unicode(text, 'ISO-8859-1').encode('UTF-8')

et hop ! comme ça tu perd même pas les accents (pour moi quand on
commence à donner la politique 'ignore' à la méthode encode, ça montre
généralement problème. Le seul cas acceptable, c'est quand on ne
connait pas l'encodage de la chaine de départ, ce qui n'est pas ton cas
ici)


Ok merci ça fonctionne parfaitement, mais juste une petite question, si
j'execute ma commande sur differentes machines je risque de tomber sur des
cas qui n'utilise
pas latin-1, dans cette situation que se passera-t-il ?


--
Posté via http://www.webatou.net/
Usenet dans votre navigateur !
Complaints-To:

Avatar
Sylvain Thenault
On Fri, 09 Jul 2004 11:55:09 +0000, Frederic-B wrote:


ton problème c'est que tu essaies d'encoder en UTF-8 une chaine encodé
en latin-1. Python essaie donc d'abord de passer ta chaine latin1 en
objet unicode en utilisant l'encodage par défaut, ascii. L'erreur se
passe donc avant l'encodage en UTF-8 (d'où l'erreur UnicodeDecodeError,
et non UnicodeEncodeError).
ça devrait aller mieux si tu fais :

text = unicode(text, 'ISO-8859-1').encode('UTF-8')

et hop ! comme ça tu perd même pas les accents (pour moi quand on
commence à donner la politique 'ignore' à la méthode encode, ça
montre généralement problème. Le seul cas acceptable, c'est quand on
ne connait pas l'encodage de la chaine de départ, ce qui n'est pas ton
cas ici)


Ok merci ça fonctionne parfaitement, mais juste une petite question, si
j'execute ma commande sur differentes machines je risque de tomber sur des
cas qui n'utilise
pas latin-1, dans cette situation que se passera-t-il ?


beh y a toutes les chances que ça plante si tu récupères une sortie en
utf-8 par exemple plutot que latin1. Dans ce cas tu peux donner en plus la
chaine 'ignore' ou 'replace' à la fonction unicode (tu dois aussi pouvoir
lancer ta commande avec un 'LC_ALL=fr' devant pour être sur de
récupérer de l'iso-8859-1, je pense que ça devrait le faire.

--
Sylvain Thénault LOGILAB, Paris (France).

http://www.logilab.com http://www.logilab.fr http://www.logilab.org