A l'origine du html, les navigateurs ne comprenaient que l'ASCII pur. Il a donc fallu trouver un moyen de représenter les caractères accentués et spéciaux. Par exemple, “sacré” devient “sacré”.
Voilà donc 2 fonctions qui font les conversions dans les 2 sens
#! /usr/bin/python # -*- coding: utf-8 -*- from __future__ import division # Python v2.7 from htmlentitydefs import codepoint2name, name2codepoint import re ############################################################################# def txt2html(txt, esp=False): """convertit la chaine normale 'txt' (unicode) en chaine html (ISO-8859-1) si esp=True, convertit en plus tous les espaces normaux => " " """ if esp: e = " " html = [] for c in txt: n = ord(c) if n in codepoint2name: html.append("&%s;" % (codepoint2name[n],)) elif esp and c == u" ": html.append(e) else: html.append(c) return ''.join(html) ############################################################################# def html2txt(html, esp=False): """convertit la chaine html 'html' (ISO-8859-1) en chaine normale (unicode) si esp=True, convertit en plus tous les " " => espaces normaux """ if esp: html = re.sub(" ", u" ", html) motif = '&(%s);' % ('|'.join(name2codepoint)) rempl = lambda m: unichr(name2codepoint[m.group(1)]) return re.sub(motif, rempl, html)
Exemple d'utilisation:
txt = u"""Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä" """ print(txt) html = txt2html(txt) print(html) txt = html2txt(html) print txt
Ce qui affiche:
Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä" Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä" Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä"
J'ai, bien entendu, vérifié dans un éditeur html que la phrase en html est bien compris par les navigateurs.
Petit complément concernant les espaces: en principe, seul l'espace insécable (160) est convertit en “ ”, mais pas l'espace normal (32). Au cas où, j'ai ajouté un drapeau 'esp' qui permet de convertir en plus les espaces normaux en “ ” dans les 2 sens.
Avec ce drapeau à True, la chaine html devient:
Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä"
Et on retrouve avec la conversion dans l'autre sens la même chaine de départ, à part que les éventuels espaces insécables sont devenus des espaces normaux.
On devrait pouvoir accélérer ces 2 fonctions (compréhension de liste, compilation de motif, etc…) mais écrites comme ça, on comprend bien ce qu'elles font.
Amusez-vous bien!