language_code language def code python django unicode character-encoding

python - language - Codificación da "codec ''ascii'' no puede codificar el carácter... ordinal no en el rango(128)"



language_code django (3)

Si los datos que está recibiendo están, de hecho, codificados en UTF-8, entonces debería ser una secuencia de bytes: un objeto Python ''str'' en Python 2.X

Puedes verificar esto con una afirmación:

assert isinstance(content, str)

Una vez que sepa que eso es cierto, puede pasar a la codificación real. Python no hace transcodificación, directamente de UTF-8 a ASCII, por ejemplo. Primero debe convertir su secuencia de bytes en una cadena Unicode, decodificándola:

unicode_content = content.decode(''utf-8'')

(Si puede confiar en parsed_feed.encoding, entonces use eso en lugar del literal ''utf-8''. De cualquier manera, prepárese para errores).

A continuación, puede tomar esa cadena y codificarla en ASCII, sustituyendo los caracteres altos con sus equivalentes de entidad XML:

xml_content = unicode_content.encode(''ascii'', ''xmlcharrefreplace'')

El método completo, entonces, se vería así:

try: content = content.decode(parsed_feed.encoding).encode(''ascii'', ''xmlcharrefreplace'') except UnicodeDecodeError: # Couldn''t decode the incoming string -- possibly not encoded in utf-8 # Do something here to report the error

Estoy trabajando en el proyecto de lector de Django RSS aquí .

La fuente RSS leerá algo como "OKLAHOMA CITY (AP) - James Harden lo dejó". La codificación de la fuente RSS lee la codificación = "UTF-8", así que creo que estoy pasando utf-8 para marcar en el siguiente fragmento de código. El dash em es donde se ahoga.

Obtengo el error Django de "''ascii'' codec no puede codificar el carácter u ''/ u2014'' en la posición 109: ordinal no en el rango (128)" que es un UnicodeEncodeError. En las variables que pasan veo "OKLAHOMA CITY (AP)" u2014 James Harden ". La línea de código que no funciona es:

content = content.encode(parsed_feed.encoding, "xmlcharrefreplace")

Estoy usando markdown 2.0, django 1.1 y python 2.4.

¿Cuál es la secuencia mágica de codificación y decodificación que necesito hacer para que esto funcione?

(En respuesta a la solicitud de Prometheus, acepto que el formato me ayude)

Entonces, en las vistas agrego una línea smart_unicode arriba de la línea de codificación parsed_feed ...

content = smart_unicode(content, encoding=''utf-8'', strings_only=False, errors=''strict'') content = content = content.encode(parsed_feed.encoding, "xmlcharrefreplace")

Esto me lleva el problema a mi models.py donde tengo

def save(self, force_insert=False, force_update=False): if self.excerpt: self.excerpt_html = markdown(self.excerpt) # super save after this

Si cambio el método guardar para tener ...

def save(self, force_insert=False, force_update=False): if self.excerpt: encoded_excerpt_html = (self.excerpt).encode(''utf-8'') self.excerpt_html = markdown(encoded_excerpt_html)

Obtengo el error "el códec ''ascii'' no puede decodificar el byte 0xe2 en la posición 141: ordinal no en el rango (128)" porque ahora dice "/ xe2 / x80 / x94" donde estaba el dash em


Encontré este error durante la escritura de un nombre de archivo con archivo zip. El siguiente falló

ZipFile.write(root+''/%s''%file, newRoot + ''/%s''%file)

y lo siguiente funcionó

ZipFile.write(str(root+''/%s''%file), str(newRoot + ''/%s''%file))