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

problème d'encodage

11 réponses
Avatar
Jonathan Barnoud
Bon, je vais finir par croire que je suis un vrai boulet.
Après mon problème de redirection dont la solution était toute bête j'ai un problème
d'encodage.

J'écris mon script en utf-8 donc il comment par #_*_ coding:utf-8 _*_.
Jusque là tout va bien.
Mais le source que je récupère est (en théorie en tout cas) en iso-8858-1. Suivant
une doc que j'ai trouvé je ne sais plus où je l'ouvre avec :

import codecs
document = codecs.open( "wakka.php", "r", "iso-8859-1" )
document = document.read()
print document

Mais python me retourne le message d'erreur suivant :

Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.3/encodings/iso8859_15.py", line 18, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\xb4' in position 3015:
character maps to <undefined>

Je me suis donc dit que contrairement aux indication du doctype du document, il était
peut-être en utf-8 :

import codecs
document = codecs.open( "wakka.php", "r", "utf-8" )
document = document.read()
print document

Mais :

Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.3/codecs.py", line 380, in read
return self.reader.read(size)
File "/usr/lib/python2.3/codecs.py", line 253, in read
return self.decode(self.stream.read(), self.errors)[0]
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 1515-1517: invalid data

Si je passe mon script en iso-8859-1 le probleme reste entier.

Ouvrir le document sans spécifier l'encodage marche mais pose des probleme en amond.
En effet je dois parser le source html et j'utilise xml.dom.minidom qui me pose des
problèmes avec les accents :

document = open("wakka.php","r")
document = document.read()
import xml.dom.minidom
## La page contient quelques fautes au niveau de la syntaxes et la mise en grase est
gênante:
document = document.replace("&nbsp;", " ")
document = document.replace("&lt;", " ")
document = document.replace("<br >", "<br />")
document = document.replace("<br>", "<br />")
document = document.replace("<br/>", "<br />")
document = document.replace("<br />", " ")
document = document.replace("<<", "<")
document = document.replace(">>", ">")
document = document.replace("<b>", "")
document = document.replace("</b>", "")
## fin des corrections
dom = xml.dom.minidom.parseString(document)

Ce qui me renvoi :

Traceback (most recent call last):
File "<stdin>", line 2, in ?
File "/usr/lib/python2.3/xml/dom/minidom.py", line 1929, in parseString
return expatbuilder.parseString(string)
File "/usr/lib/python2.3/xml/dom/expatbuilder.py", line 940, in parseString
return builder.parseString(string)
File "/usr/lib/python2.3/xml/dom/expatbuilder.py", line 223, in parseString
parser.Parse(string, True)
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 39, column 141

Hors il s'agit du premier accent du document.
Si je rajoute ceci avant de parser :

document = document.replace("é","é")
document = document.replace("ä","ä")
document = document.replace("è","è")
document = document.replace("à","Ã ")
document = document.replace("ç","ç")
document = document.replace("ô","ô")
document = document.replace("ù","ù")
document = document.replace("ï","ï")
document = document.replace("ë","ë")
document = document.replace("´","'")
document = document.replace("É","É")
document = document.replace("ô","ô")
document = document.replace("ê","ê")
document = document.replace("û","û")
document = document.replace("î","î")
document = document.replace("â","â")

Ça marche si je suis en utf-8 mais pas si je suis en iso (et au passage il ne
remplace pas les ô...)

Mais par la suite les problèmes d'encodages se poursuivent.
Si je fais :

table = dom.getElementsByTagName("table")[2:10]
for tab in table:
line = tab.getElementsByTagName("tr")[1:]
for li in line:
cell = li.getElementsByTagName("td")[1:]
print cell[0].childNodes[0]

Python me retourne :

<DOM Text node "Seau d'eau">
<DOM Text node "Sac de fro...">
<DOM Text node "Gibier">
<DOM Text node "Bouteille ...">
Traceback (most recent call last):
File "exo2.py", line 108, in ?
print cell[0].childNodes[0]
UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 25:
ordinal not in range(128)

Je suis donc perplexe et désemparer. Ça semblait pourtant si simple...

Merci de votre aide,

Jonathan Barnoud

1 réponse

1 2
Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Je retire deux phrases de mon message précédent (ou plutôt, je les
remplace).


Avec SciTE, si l'on va modifier le fichier "SciTEGlobal.properties", à la
section "if PLAT_WIN", pour indiquer, comme police de caractères "Arial
Unicode MS", on obtient bien l'affichage des caractères Unicode.

Du coup, le copier/coller en Unicode fonctionne également.


Petits rappels :
- il faut que la police Arial Unicode MS soit installée sur le système
(pas si évident que ça)
- le moteur Uniscribe doit être à niveau (mais le SP2 de XP installe la
dernière version)


Bonne journée
--
Michel Claveau
1 2