¿Dónde está la base de datos de Python para el “mejor ASCII para este Unicode”?

Tengo un texto que utiliza puntuación de Unicode, como comillas dobles a la izquierda, comillas simples a la derecha para apóstrofes, etc., y lo necesito en ASCII. ¿Python tiene una base de datos de estos personajes con sustitutos obvios de ASCII, por lo que puedo hacerlo mejor que convertirlos en “?” ?

Unidecode parece una solución completa. Convierte las citas de lujo en citas ascii, los caracteres latinos acentuados en no acentuados e incluso intenta la transliteración para tratar los caracteres que no tienen equivalentes ASCII. ¿De esa manera tus usuarios no tienen que ver un montón de? cuando tuvo 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/

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 unicodedata.normalize que unicodedata.normalize se implementa mediante la función unicode.decomposition , lo que me lleva a creer que probablemente solo pueda manejar caracteres Unicode que son combinaciones de una letra y un signo diacrítico. pero no soy realmente un experto en la especificación Unicode, así que podría estar lleno de air caliente …

En cualquier caso, puede usar unicode.translate para tratar con los caracteres de puntuación en su lugar. El método de translate lleva un diccionario de los ordinales de Unicode a los ordinales de Unicode, por lo que puede crear una asignación que traduzca la puntuación de Unicode solo a la 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 necesariamente deba preocuparse por el manejo de cada uno de los caracteres de puntuación de Unicode. Si necesita manejar los acentos y otras marcas diacríticas, aún puede usar unicodedata.normalize para tratar con esos caracteres.

Interesante pregunta.

Google me ayudó a encontrar esta página que describe el módulo de datos unicoded de la siguiente manera:

 import unicodedata unicodedata.normalize('NFKD', title).encode('ascii','ignore') 

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.