Pregunta

¿Cómo convierte una cadena Unicode (que contiene caracteres adicionales como & # 163; $, etc.) en una cadena Python?

¿Fue útil?

Solución

title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'

Otros consejos

Puede usar la codificación a ASCII si no necesita traducir los caracteres que no son ASCII:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
>>> text=u'abcd'
>>> str(text)
'abcd'

Si la cadena solo contiene caracteres ascii.

Si tiene una cadena Unicode y desea escribirla en un archivo u otra forma serializada, primero debe codificarla en una representación particular que pueda almacenarse. Hay varias codificaciones Unicode comunes, como UTF-16 (usa dos bytes para la mayoría de los caracteres Unicode) o UTF-8 (1-4 bytes / punto de código según el carácter), etc. Para convertir esa cadena en una codificación particular, usted puede usar:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

Esta cadena de bytes sin procesar se puede escribir en un archivo. Sin embargo, tenga en cuenta que al volver a leerlo, debe saber en qué codificación está y decodificarlo con esa misma codificación.

Al escribir en archivos, puede deshacerse de este proceso de codificación / decodificación manual utilizando los códecs módulo. Entonces, para abrir un archivo que codifica todas las cadenas Unicode en UTF-8 , use:

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

Tenga en cuenta que cualquier otra cosa que use estos archivos debe comprender en qué codificación está el archivo si desea leerlos. Si usted es el único que hace la lectura / escritura, esto no es un problema, de lo contrario, asegúrese de escribir de forma comprensible para cualquier otra persona que use los archivos.

En Python 3, esta forma de acceso a archivos es la predeterminada, y la función incorporada open tomará un parámetro de codificación y siempre se traducirá a / desde cadenas Unicode (el objeto de cadena predeterminado en Python 3) para los archivos abiertos en modo texto.

Aquí hay un ejemplo:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

Bueno, si está dispuesto / listo para cambiar a Python 3 (que puede no ser debido a la incompatibilidad hacia atrás con algún código de Python 2), no tiene que realizar ninguna conversión; todo el texto en Python 3 se representa con cadenas Unicode, lo que también significa que no hay más uso de la sintaxis u'<text>'. También tiene lo que son, en efecto, cadenas de bytes, que se utilizan para representar datos (que pueden ser una cadena codificada).

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(Por supuesto, si actualmente está usando Python 3, entonces el problema probablemente esté relacionado con la forma en que intenta guardar el texto en un archivo).

Aquí hay un código de ejemplo

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top