2010-04-30 64 views
16

Tengo una cadena de HTML almacenada en una base de datos. Desafortunadamente contiene caracteres como ® Quiero reemplazar estos caracteres por su equivalente en HTML, ya sea en el DB mismo o usando Buscar reemplazar en mi código de Python/Django.Eliminar caracteres no ASCII de una cadena usando python/django

¿Alguna sugerencia sobre cómo puedo hacer esto?

+3

¿Por qué quiere reemplazarlos? Si tiene el código Unicode correcto, debería mostrarlo en la página correctamente. Hagas lo que hagas, ** no ** pongas datos codificados en HTML en tu base de datos. – bobince

+0

+1 por bobince: ¿está seguro de que quiere reemplazarlos? Solo tiene que indicarle al navegador que está utilizando Unicode agregando una metaetiqueta como '' –

Respuesta

19

puede utilizar que los caracteres ASCII son los primeros 128 queridos, a fin de obtener el número de cada personaje con ord y tiras que si está fuera del rango

# -*- 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) 

Resultado

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

favor tenga en cuenta que @ está incluido porque, bueno, después de todo, es un carácter ASCII. Si desea quitar un subconjunto particular (como solo números y letras mayúsculas y minúsculas), puede limitar el rango mirando a ASCII table

EDITADO: Después de leer su pregunta nuevamente, tal vez necesite escapar su código HTML, por lo que todos esos caracteres aparecen correctamente una vez renderizados. Puede usar el filtro escape en sus plantillas.

+1

AFAIK Django's el filtro de escape no escapa de los caracteres Unicode, solo escapa a estos: '< > '' y' – Zack

3

Encontré esto hace un tiempo, así que este no es de ninguna manera mi trabajo. No puedo encontrar la fuente, pero aquí está el fragmento de mi código.

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 

utilizar de esta manera

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

Para deshacerse de la especial xml, caracteres html '<', '>', '&' puede usar cgi.escape:

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

volverá:

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

Este es probablemente el mínimo que necesita para evitar problemas. Para obtener más información, debe conocer la codificación de su cadena. Si se ajusta a la codificación de su documento html, no tiene que hacer nada más. Si no tiene que convertir a la codificación correcta.

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

Suponiendo que la cadena era CP1252 y que el documento HTML es utf8

2

Este fragmento de código puede ayudarle.

#!/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) 

que se realiza en la segunda línea de la definición codificación es muy importante aquí.

0

Hay una respuesta mucho más sencillo de esto en https://stackoverflow.com/a/18430817/5100481

Para eliminar caracteres no ASCII de una cadena, s, utilice:

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

luego convertirlo de bytes de vuelta a una cadena utilizando :

s = s.decode()

todo esto usando Python 3.6

Cuestiones relacionadas