2010-04-30 13 views
16

J'ai une chaîne de code HTML stockée dans une base de données. Malheureusement, il contient des caractères tels que ® Je veux remplacer ces caractères par leur équivalent HTML, soit dans la base de données elle-même ou en utilisant un remplacement de recherche dans mon code Python/Django.Supprimer des caractères non-ASCII d'une chaîne à l'aide de python/django

Des suggestions sur comment je peux le faire?

+3

Pourquoi voulez-vous les remplacer? Si vous avez votre droit Unicode, ils devraient juste afficher dans la page bien. Quoi que vous fassiez **, ne mettez pas ** de données codées en HTML dans votre base de données. – bobince

+0

+1 pour bobince: êtes-vous sûr de vouloir les remplacer? Vous avez juste besoin de dire au navigateur que vous utilisez unicode en ajoutant une balise meta comme '' –

Répondre

19

Vous pouvez utiliser que les caractères ASCII sont les premiers 128 ceux, donc obtenir le nombre de chaque personnage avec ord et de la bande si elle est hors de portée

# -*- coding: utf-8 -*- 

def strip_non_ascii(string): 
    ''' Returns the string without non ASCII characters''' 
    stripped = (c for c in string if 0 < ord(c) < 127) 
    return ''.join(stripped) 


test = u'éáé123456tgreáé@€' 
print test 
print strip_non_ascii(test) 

Résultat

éáé123456tgreáé@€ 
[email protected] 

S'il vous plaît Notez que @ est inclus car, après tout, c'est un caractère ASCII. Si vous voulez supprimer un sous-ensemble particulier (comme des chiffres et des lettres majuscules et minuscules), vous pouvez limiter la plage à ASCII table

EDITED: Après avoir relu votre question, vous devrez peut-être échapper votre code HTML, donc tous ces caractères apparaissent correctement une fois rendus. Vous pouvez utiliser le filtre escape sur vos modèles.

+1

AFAIK Django's Le filtre d'échappement n'échappe pas aux caractères Unicode, il échappe seulement à ceux-ci: '< >" '& ' – Zack

3

Je l'ai trouvé il y a un certain temps, donc ce n'est en aucun cas mon travail. Je ne peux pas trouver la source, mais voici l'extrait de mon code.

def unicode_escape(unistr): 
    """ 
    Tidys up unicode entities into HTML friendly entities 

    Takes a unicode string as an argument 

    Returns a unicode string 
    """ 
    import htmlentitydefs 
    escaped = "" 

    for char in unistr: 
     if ord(char) in htmlentitydefs.codepoint2name: 
      name = htmlentitydefs.codepoint2name.get(ord(char)) 
      entity = htmlentitydefs.name2codepoint.get(name) 
      escaped +="&#" + str(entity) 

     else: 
      escaped += char 

    return escaped 

utiliser comme ceci

>>> from zack.utilities import unicode_escape 
>>> unicode_escape(u'such as ® I want') 
u'such as &#174 I want' 
1

Pour se débarrasser de la xml spécial, caractères html '<', '>', '&' vous pouvez utiliser cgi.escape:

import cgi 
test = "1 < 4 & 4 > 1" 
cgi.escape(test) 

sera de retour:

'1 &lt; 4 &amp; 4 &gt; 1' 

Ceci est probablement le strict minimum que vous devez éviter les problèmes. Pour en savoir plus, vous devez connaître l'encodage de votre chaîne. Si cela correspond à l'encodage de votre document html, vous n'avez rien à faire de plus. Sinon, vous devez convertir le codage correct.

test = test.decode("cp1252").encode("utf8") 

que votre chaîne Supposant était CP1252 et que votre document html est UTF8

2

Cet extrait de code peut vous aider.

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

def removeNonAscii(string): 
    nonascii = bytearray(range(0x80, 0x100)) 
    return string.translate(None, nonascii) 

nonascii_removed_string = removeNonAscii(string_to_remove_nonascii) 

La définition de l'encodage est ici très important qui se fait dans la deuxième ligne.

0

Il y a beaucoup plus simple réponse à cela à https://stackoverflow.com/a/18430817/5100481

Pour supprimer les caractères non-ASCII d'une chaîne, s, utilisez:

s = s.encode('ascii',errors='ignore')

convertir ensuite de octets en une chaîne en utilisant :

s = s.decode()

tout cela en utilisant Python 3.6