Problème encodage caractère et accents avec python

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour

j’ai un petit soucis lié surement à l’encodage

J’ai un programme en cours de réalisation en python qui utilise GTk+ et un textview qui contient du texte avec des tags (tout cela enregistré dans une base de donnée) Lien GitLab du projet

Carnet Alphabétique Thématique copie écran 1.jpg
Carnet Alphabétique Thématique copie écran 1.jpg

Depuis quelque jour je suis sur la partie "Impression/Sauvegarde" de mes TextView (qui sont déjà dans une Base de donnée)

Je compte générer un fichier HTML et j’ai commencer à intégrer "BeautifulSoup"

        format = self.buffer.register_serialize_tagset("application/x-gtk-text-buffer-rich-text")
        data = self.buffer.serialize(self.buffer, format, self.buffer.get_start_iter(), self.buffer.get_end_iter())
        print("[1] -> ",data)

        data=str(data).split('<text_view_markup>', 1)
        # data = data.decode("utf-8")
        del data[0]
        data[0] = '<text_view_markup>' + str(data[0])

        data = data[0].split('</tags>', 1)
        del data[0]

        data = data[0].split('</text_view_markup>', 1)
        print("[3] -> ",data)
        data = str(data[0]).replace("\\n", '<br>')

        print("[4] -> ",data)

        soup = BeautifulSoup(data,features="lxml")

        soupTags = soup.find_all('apply_tag')

        for tag in soupTags:

            if tag['name'] == 'bold':
                tag.name = 'b'
                del tag['name']
            elif tag['name'] == 'italic':
                tag.name = 'em'
                del tag['name']
            elif tag['name'] == 'underline':
                tag.name = 'u'
                del tag['name']
            elif tag['name'] == 'size12':
                tag.name = 'font size=12'
                del tag['name']
            elif tag['name'] == 'size15':
                tag.name = 'font size=15'
                del tag['name']
            elif tag['name'] == 'red':
                tag.name = 'font color="#FF0000";'
                del tag['name']

        print ("[5] -> ",soup)

Voici les sorties textes :

[1] -> b’GTKTEXTBUFFERCONTENTS-0001\x00\x00\x01\x82 <text_view_markup>\n <tags>\n <tag name="bold" priority="0">\n <attr name="weight" type="gint" value="700" />\n </tag>\n <tag name="size15" priority="14">\n <attr name="size" type="gint" value="15360" />\n </tag>\n </tags>\n<text><apply_tag name="size15"><apply_tag name="bold">Th\xc3\xa8me : Equipements / Lettre A :</apply_tag></apply_tag>\n\nNote pour la lettre A</text>\n</text_view_markup>\n'

et

[5] -> <html><body><br/><text><font size=15><b>Th\xc3\xa8me : Equipements / Lettre A :</b></font size=15><br/><br/>Note pour la lettre A</text><br/></body></html>

Comme vous le voyez ça n’est pas trop mal mais ensuite si je sauve ma sortie html, IMPOSSIBLE D’AVOIR LES BON ACCENTS sur le navigateur même si je rajoute une balise meta

Carnet Alphabétique Thématique copie écran 2.jpg
Carnet Alphabétique Thématique copie écran 2.jpg

J’ai bien tenté de décoder l’utf-8 juste après le 'buffer.serialize' mais cela me donne des erreurs

Je cherche des pistes de solutions

Merci d’avance

Édité par Aabu

+0 -0

par copier/coller dans un fichier texte que je renomme ensuite J’ai hésité a faire mieux tant que je n’ai pas validé le process !

lemarec

C’est donc sûrement la source de l’erreur.

Quand en Python tu as b'\xc3\xa8', c’est la représentation correspondant au caractère è en UTF-8.

>>> 'è'.encode()
b'\xc3\xa8'

En copiant-collant cela dans un éditeur tu obtiens sûrement une copie caractère par caractère (\, x, c, 3, etc.) et donc perds toute notion d’échappement. Il te faudrait faire la sauvegarde dans un fichier directement depuis Python (ou alors décoder la chaîne avant de la copier).

Auteur du sujet

j’ai testé beaucoup de choses afin de décoder l’utf8 juste après self.buffer.serialize mais je n’ai que des erreurs Carnet Alphabétique Thématique copie écran 3.jpg

J’ai trouvé une solution 'moche' en remplaçant data = data.decode("uft-8") par data = data.decode("latin-1")

ensuite je cherche les caractères du type "è" et je les remplace pas "è" et idem pour tous les caractères accentués !!!!

Édité par lemarec

+0 -0

C’est le problème des données récupérées comme ça sur Internet, il y a énormément d’erreurs d’encodage, de mélanges et autres.

Une solution pourrait être d’utiliser l’argument errors de la méthode decode :

>>> b"O\xc3\xb9 est-il l\x82'\xc3\xa9t\xc3\xa9 ?".decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 12: invalid start byte
>>> b"O\xc3\xb9 est-il l\x82'\xc3\xa9t\xc3\xa9 ?".decode(errors='ignore')
"Où est-il l'été ?"
>>> b"O\xc3\xb9 est-il l\x82'\xc3\xa9t\xc3\xa9 ?".decode(errors='replace')
"Où est-il l�'été ?"

Édité par entwanne

Auteur du sujet

Super merci beaucoup, ça, ça marche

Je cherche ensuite à transformer le html en pdf ou .doc, .odt

J’ai trouvé Pandoc

J’ai cherché un module python, je teste 'pypandoc'

Édité par lemarec

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte