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

StackOverflow https://stackoverflow.com/questions/816285

  •  03-07-2019
  •  | 
  •  

Pregunta

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 personajes con sustitutos ASCII obvios, por lo que puedo hacerlo mejor que convertirlos a todos en "? & Quot; ?

¿Fue útil?

Solución

Unidecode parece una solución completa. Convierte citas extravagantes en citas ascii, caracteres latinos acentuados en no acentuados e incluso intenta la transliteración para tratar caracteres que no tienen equivalentes ASCII. De esa manera, sus 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 /

Otros consejos

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

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

Pregunta interesante.

Google me ayudó a encontrar esta página que aparece en módulo unicodedata como el siguiente:

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 sean letras.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top