80 votos

¿Dónde está Python ' s "mejor ASCII para este Unicode" base de datos?

Tengo un texto que utiliza Unicode puntuación, comilla doble izquierda, derecha comilla para apóstrofe y así sucesivamente, y lo necesito en ASCII. ¿Python tiene una base de datos de estos personajes con evidente ASCII sustitutos para que pueda hacer mejor convirtiéndolos en "?"?

85voto

joeforker Puntos 14483

Unidecode se ve como una solución completa. Convierte la fantasía de las comillas ascii comillas, acentuados caracteres latinos para no acentuada e incluso intentos de transliteración para lidiar con personajes que no tienen equivalentes ASCII. De esa manera los usuarios no tienen que ver un montón de ? cuando usted tuvo que pasar su texto a través de un legado ascii de 7 bits del sistema.

>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing

http://www.tablix.org/~avian/blog/archives/2009/01/unicode%5Ftransliteration%5Fin%5Fpython/

24voto

Mike Spross Puntos 4825

En mi respuesta original, también me sugirió unicodedata.normalize. Sin embargo, me decidí a probarlo y resulta que no funciona con Unicode comillas. Hace un buen trabajo traduciendo acentuados caracteres Unicode, así que supongo unicodedata.normalize es implementado usando la unicode.decomposition función, lo que me lleva a pensar que probablemente sólo se puede manejar de caracteres Unicode, que son combinaciones de una carta y una marca diacrítica, pero realmente yo no soy un experto en la especificación Unicode, así que sólo podría estar lleno de aire caliente...

En cualquier caso, usted puede utilizar unicode.translate a lidiar con los caracteres de puntuación en su lugar. El translate método toma un diccionario de Unicode ordinales a Unicode ordinales, por lo tanto usted puede crear una asignación que se traduce en Unicode sólo la puntuación compatible con ASCII, signos de puntuación:

'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!"'

Usted puede agregar más puntuación asignaciones si es necesario, pero no creo que necesariamente necesita preocuparse acerca de la manipulación de cada uno de Unicode del carácter de puntuación. Si hacemos necesitan manejar los acentos y otros signos diacríticos, usted todavía puede usar unicodedata.normalize a lidiar con esos personajes.

19voto

easel Puntos 2466

Pregunta interesante.

Google me ayudó a encontrar esta página que describe utilizando el módulo unicodedata como los siguientes:

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

3voto

Andrew Dalke Puntos 7607

No hay discusión adicional sobre esto en el 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 no-carta.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X