Tengo una cadena Unicode con caracteres latinos acentuados, p.latin-1 a ascii
n=unicode('Wikipédia, le projet d’encyclopédie','utf-8')
quiero convertirlo en ASCII es decir, 'Wikipedia, le projet dencyclopedie', por lo que todos aguda/acento, cedilla, etc. deben quedar eliminado
¿Cuál es la manera más rápida de hacer eso, ya que que había que hacer para hacer coincidir una lista desplegable a largo autocompletar
Conclusión: Como uno de mis criterios es la velocidad, Lennart de 'registrar su propio gestor de errores de codificación unicode/decodificación' da mejor resultado (véase la respuesta de Alex), velocidad la diferencia aumenta aún más a medida que aumenta la c hars son latinos
Aquí está la tabla de traducción que estoy usando, gestor de errores también modificado, ya que tiene que hacerse cargo de toda la gama de carbón no-codificado de error.start a error.end
# -*- coding: utf-8 -*-
import codecs
"""
This is more of visual translation also avoiding multiple char translation
e.g. £ may be written as {pound}
"""
latin_dict = {
u"¡": u"!", u"¢": u"c", u"£": u"L", u"¤": u"o", u"¥": u"Y",
u"¦": u"|", u"§": u"S", u"¨": u"`", u"©": u"c", u"ª": u"a",
u"«": u"<<", u"¬": u"-", u"": u"-", u"®": u"R", u"¯": u"-",
u"°": u"o", u"±": u"+-", u"²": u"2", u"³": u"3", u"´": u"'",
u"µ": u"u", u"¶": u"P", u"·": u".", u"¸": u",", u"¹": u"1",
u"º": u"o", u"»": u">>", u"¼": u"1/4", u"½": u"1/2", u"¾": u"3/4",
u"¿": u"?", u"À": u"A", u"Á": u"A", u"Â": u"A", u"Ã": u"A",
u"Ä": u"A", u"Å": u"A", u"Æ": u"Ae", u"Ç": u"C", u"È": u"E",
u"É": u"E", u"Ê": u"E", u"Ë": u"E", u"Ì": u"I", u"Í": u"I",
u"Î": u"I", u"Ï": u"I", u"Ð": u"D", u"Ñ": u"N", u"Ò": u"O",
u"Ó": u"O", u"Ô": u"O", u"Õ": u"O", u"Ö": u"O", u"×": u"*",
u"Ø": u"O", u"Ù": u"U", u"Ú": u"U", u"Û": u"U", u"Ü": u"U",
u"Ý": u"Y", u"Þ": u"p", u"ß": u"b", u"à": u"a", u"á": u"a",
u"â": u"a", u"ã": u"a", u"ä": u"a", u"å": u"a", u"æ": u"ae",
u"ç": u"c", u"è": u"e", u"é": u"e", u"ê": u"e", u"ë": u"e",
u"ì": u"i", u"í": u"i", u"î": u"i", u"ï": u"i", u"ð": u"d",
u"ñ": u"n", u"ò": u"o", u"ó": u"o", u"ô": u"o", u"õ": u"o",
u"ö": u"o", u"÷": u"/", u"ø": u"o", u"ù": u"u", u"ú": u"u",
u"û": u"u", u"ü": u"u", u"ý": u"y", u"þ": u"p", u"ÿ": u"y",
u"’":u"'"}
def latin2ascii(error):
"""
error is protion of text from start to end, we just convert first
hence return error.start+1 instead of error.end
"""
return latin_dict[error.object[error.start]], error.start+1
codecs.register_error('latin2ascii', latin2ascii)
if __name__ == "__main__":
x = u"¼ éíñ§ÐÌëÑ » ¼ ö ® © ’"
print x
print x.encode('ascii', 'latin2ascii')
Por qué vuelvo error.start + 1
:
El objeto de error devuelto puede ser de varios caracteres, por ejemplo, solo convertimos primero, por ejemplo si añado print error.start, error.end
al error de salida manejador es
¼ éíñ§ÐÌëÑ » ¼ ö ® © ’
0 1
2 10
3 10
4 10
5 10
6 10
7 10
8 10
9 10
11 12
13 14
15 16
17 18
19 20
21 22
1/4 einSDIeN >> 1/4 o R c '
por lo que en segunda línea tenemos caracteres de 2-10 pero convertir sólo segundo por lo tanto, volver 3 como punto de continuar, si volvemos salida error.end es
¼ éíñ§ÐÌëÑ » ¼ ö ® © ’
0 1
2 10
11 12
13 14
15 16
17 18
19 20
21 22
1/4 e >> 1/4 o R c '
Como podemos ver, la parte 2-10 ha sido reemplazada por una sola char. fuera de curso, sería más rápido codificar todo el rango de una vez y devolver el error. Pero para fines de demostración lo he mantenido simple.
ver http://docs.python.org/library/codecs.html#codecs.register_error para más detalles
Estoy seguro de que está al tanto, pero tenga cuidado de no mostrar estas cadenas de caracteres certificadas al usuario. El significado de una palabra puede cambiar totalmente cuando cambias las letras más o menos al azar (lo que hace que 'o' se convierta en 'o' y así sucesivamente). – unwind
sí esto no es para mostrar sino para escribir, tenemos un teclado en pantalla con letras ascii problema es cómo el usuario tecleará é o õ, entonces si los tipos e, debe coincidir con cadena que tiene e, é, ê etc. –
I Don ' Entiendo su sustitución de 'error.start + 1' por' error.end'.¿Puede usted explicar por favor? Ambos parecen funcionar igual para mí. – gorus