2010-11-12 14 views
16

Hola recupero de datos basado en texto UTF-8 de una fuente externa que contiene caracteres especiales como u"ıöüç" mientras que yo quiero normalizarlos a Inglés como "ıöüç" ->"iouc". ¿Cuál sería la mejor manera de lograr esto?Python y la normalización de caracteres

+0

Buscar y reemplazar tal vez, usted tiene que tener un arsenal completo de especial para caracteres normales sin embargo. – soulseekah

Respuesta

36

recomiendo el uso de Unidecode module:

>>> from unidecode import unidecode 
>>> unidecode(u'ıöüç') 
'iouc' 

Nota cómo se alimenta una cadena Unicode y se da salida a una cadena de bytes. La salida está garantizada para ser ASCII.

+3

Nice one +1 http://pypi.python.org/pypi/Unidecode/0.04.1 – soulseekah

0
import unicodedata 
unicodedata.normalize() 

http://docs.python.org/library/unicodedata.html

+0

Estoy un poco confundido: He intentado imprimir unicodedata.normalize ('NFKD', u "ıöüç") y la salida es de nuevo: ıöüç – Hellnar

+0

Pruebe los otros valores válidos 'NFC', 'NFKC', 'NFD' y 'NFKD'. – soulseekah

+2

Estoy bastante seguro de que esta es una operación diferente a la que busca el asker. Pero sí, esto es normalización Unicode. Lo que está preguntando no suele ser referido como tal. – drxzcl

5

Todo depende de qué tan lejos desee transitar el resultado. Si desea convertir todo en ASCII (αβγ a abg), entonces unidecode es el camino a seguir.

Si lo que desea es eliminar los acentos de las letras acentuadas, entonces usted podría intentar descomponer la cadena utilizando el formulario de normalización NFKD (esto convierte la letra acentuada á a una carta normal a seguido por U+0301 COMBINING ACUTE ACCENT) y luego desechar los acentos (que pertenecen al Unicode character classMn - "Marcar, no espaciar").

import unicodedata 

def remove_nonspacing_marks(s): 
    "Decompose the unicode string s and remove non-spacing marks." 
    return ''.join(c for c in unicodedata.normalize('NFKD', s) 
        if unicodedata.category(c) != 'Mn') 
1

La forma más sencilla que he encontrado:

unicodedata.normalize('NFKD', s).encode("ascii", "ignore")