IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Conversion de car. accentués en pur ASCII html


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut Conversion de car. accentués en pur ASCII html
    Bonjour,

    Je dois fabriquer avec Python une page html comprenant des caractères accentués issues d'une base de données.

    Je sais que les navigateurs récents supportent ces caractères, mais cette page est destinée à être lue à l'international (env. 40 pays), et elle devrait pouvoir être lue par des navigateurs anciens. J'aimerais donc faire la conversion afin que la page html reste en pur ASCII.

    Par exemple:

    (voir par exemple http://www.w3schools.com/tags/ref_entities.asp)

    Quelqu'un connait-il un module ou une fonction qui fait cette conversion en Python?

    Merci d'avance!

    Tyrtamos

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 748
    Par défaut
    Salut,
    A mon sens, il d'abord décoder les caractères accentués en Unicode puis construire la page HTML en Unicode puis transformer cet Unicode en html entities.

    Le module htmlentitydefs contient les mappings Unicode <=> html entities. Notamment le dict codepoint2name, pour aller d'Unicode à name de l'html entity.

    Note: à la lecture du source, çà ne traite pas les escapes - les caractères ascii devant être écrits &amp; &lt; &gt;
    Cordialement et meilleurs vœux
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour.

    Ceci devrait te convenir.

    Code Python 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #! /usr/bin/env python
    #coding=utf-8
     
    # WARNING ! Python 2.6
     
    # Source
    #    http://www.developpez.net/forums/d933074/autres-langages/python-zope/general-python/encoder-carcteres-speciaux-html-entity/#post5258518
     
    from htmlentitydefs import codepoint2name
     
     
    def htmlCoding(stringToClean):
        return ''.join('&%s;' % codepoint2name[ord(c)] if ord(c) in codepoint2name else c for c in stringToClean)
     
     
    if __name__ == '__main__':
        test = "Voilà une phrase accentuée qui vaut « 1€ »."
     
        print(test)
        print(' '*4 + ' HTML ' + ' '*4)
        print(htmlCoding(test))
    Code Python 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #! /usr/bin/env python
     
    # WARNING ! Python 3
     
    # Source
    #    http://www.developpez.net/forums/d933074/autres-langages/python-zope/general-python/encoder-carcteres-speciaux-html-entity/#post5258518
     
    from html.entities import codepoint2name
     
    def htmlCoding(stringToCode):
        return ''.join( '&%s;' % codepoint2name[ord(oneChar)]
                        if ord(oneChar) in codepoint2name
                        else oneChar for oneChar in stringToCode )
     
     
    if __name__ == '__main__':
        test = "Voilà une phrase accentuée qui vaut « 1€ »."
     
        print( test,
               'HTML'.rjust(9),
               htmlCoding(test),
               sep = '\n' )

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Merci wiztricks et rambc, ce module htmlentitydefs (Python 2.7) m'avait échappé.

    Problème résolu!

    Et meilleurs voeux pour 2011!

    Tyrtamos

  5. #5
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Et meilleurs voeux pour 2011!
    Tout pareil...

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Au cas où ça intéresserait quelqu'un, voilà ce que j'ai fait pour mon usage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    # 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 => "&nbsp;"
        """
        if esp:
            e = "&nbsp;"
        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 "&nbsp;" => espaces normaux
        """
        if esp:
           html = re.sub("&nbsp;", u" ", html)
        motif = '&(%s);' % ('|'.join(name2codepoint))
        rempl = lambda m: unichr(name2codepoint[m.group(1)])
        return re.sub(motif, rempl, html)
    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä" 
    Voil&agrave; une phrase accentu&eacute;e qui vaut &laquo; 1&euro; &raquo;. Compl&eacute;ment: &quot;&eacute;&egrave;&ccedil;&agrave;&ugrave;&ocirc;&icirc;&euml;&auml;&quot; 
    Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä"
    Manifestement, ça marche. 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 "&nbsp;", 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 "&nbsp;" dans les 2 sens. Avec ce drapeau à True, la chaine html devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voil&agrave;&nbsp;une&nbsp;phrase&nbsp;accentu&eacute;e&nbsp;qui&nbsp;vaut&nbsp;&laquo;&nbsp;1&euro;&nbsp;&raquo;.&nbsp;Compl&eacute;ment:&nbsp;&quot;&eacute;&egrave;&ccedil;&agrave;&ugrave;&ocirc;&icirc;&euml;&auml;&quot;
    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.

    Pour garder cette solution en mémoire, j'ai ajouté le tuto sur mon site: http://python.jpvweb.com/mesrecettes...=conv_txt_html

    Tyrtamos

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2005] Conversion caractères HTML en caractères accentués
    Par philreut dans le forum Développement
    Réponses: 10
    Dernier message: 05/09/2013, 08h37
  2. Problème de conversion d'un caractère en code ASCII
    Par sebsebseb0608 dans le forum Qt
    Réponses: 5
    Dernier message: 09/07/2012, 11h00
  3. Réponses: 0
    Dernier message: 24/06/2011, 17h54
  4. Conversion des caractères accentués
    Par chrisbill dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 05/02/2009, 14h04
  5. [OpenOffice][Base de données] Conversion de charactères HTML en charactères accentués
    Par shoryu-ken dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 06/05/2008, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo