Tengo un texto que usa puntuación Unicode, como comillas dobles a la izquierda, comillas simples a la derecha para apóstrofo, etc., y lo necesito en ASCII. ¿Python tiene una base de datos de estos caracteres con sustitutos ASCII obvios para que pueda hacerlo mejor que convertirlos todos en "?" ?
85
Respuestas:
Unidecode parece una solución completa. Convierte citas elegantes en citas ascii, caracteres latinos acentuados en sin acentos e incluso intenta la transliteración para tratar con caracteres que no tienen equivalentes ASCII. De esa manera, sus usuarios no tendrán que ver muchos? cuando tenía que pasar su texto a través de un sistema ascii de 7 bits heredado.
>>> from unidecode import unidecode >>> print unidecode(u"\u5317\u4EB0") Bei Jing
http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/
fuente
s/ö/oe/
, etc.) antes de limpiar el resto conunidecode
.ä -> a
,ö -> o
es francamente mal, todavía es preferibleae
yoe
En mi respuesta original, también sugerí
unicodedata.normalize
. Sin embargo, decidí probarlo y resulta que no funciona con comillas Unicode. Hace un buen trabajo traduciendo caracteres Unicode acentuados, así que supongo queunicodedata.normalize
se implementa usando launicode.decomposition
función, lo que me lleva a creer que probablemente solo puede manejar caracteres Unicode que son combinaciones de una letra y un signo diacrítico, pero no lo soy un experto en la especificación Unicode, por lo que podría estar lleno de aire caliente ...En cualquier caso, puede utilizar
unicode.translate
para tratar con caracteres de puntuación. Eltranslate
método toma un diccionario de ordinales Unicode a ordinales Unicode, por lo que puede crear una asignación que traduzca la puntuación solo Unicode a puntuación compatible con ASCII:'Maps left and right single and double quotation marks' 'into ASCII single and double quotation marks' >>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 } >>> teststring = u'\u201Chello, world!\u201D' >>> teststring.translate(punctuation).encode('ascii', 'ignore') '"hello, world!"'
Puede agregar más asignaciones de puntuación si es necesario, pero no creo que deba preocuparse necesariamente por el manejo de cada carácter de puntuación Unicode. Si usted no necesita acentos mango y otros signos diacríticos, todavía se puede utilizar
unicodedata.normalize
para hacer frente a esos personajes.fuente
Interesante pregunta.
Google me ayudó a encontrar esta página que describe el uso del módulo unicodedata de la siguiente manera:
import unicodedata unicodedata.normalize('NFKD', title).encode('ascii','ignore')
fuente
Hay una discusión adicional sobre esto en http://code.activestate.com/recipes/251871/ que tiene la solución NFKD y algunas formas de hacer una tabla de conversión, para cosas como ± => +/- y otros caracteres que no son letras.
fuente