Convertir caracteres Unicode en cadenas ASCII en Python
Caracteres Unicode es el estándar de codificación global para caracteres para todos los idiomas. A diferencia de ASCII, que solo admite un byte por carácter, los caracteres Unicode extienden esta capacidad a 4 bytes, lo que lo hace compatible con más caracteres en cualquier idioma.
Este tutorial muestra cómo convertir caracteres Unicode en una cadena ASCII. El objetivo es eliminar los caracteres que no son compatibles con ASCII o reemplazar los caracteres Unicode con su carácter ASCII correspondiente.
Utilice unicodedata.normalize()
y encode()
para convertir Unicode a ASCII String en Python
El módulo de Python unicodedata
proporciona una forma de utilizar la base de datos de caracteres en Unicode y funciones de utilidad que ayudan a acceder, filtrar y buscar estos caracteres de manera significativamente más fácil.
unicodedata
tiene una función llamada normalize()
que acepta dos parámetros, la forma normalizada de la cadena Unicode y la cadena dada.
Hay 4 tipos de formas Unicode normalizadas: NFC
, NFKC
, NFD
y NFKD
. Para obtener más información sobre esto, la documentación oficial está disponible para obtener una explicación completa y detallada de cada tipo. La forma normalizada NFKD
se utilizará a lo largo de este tutorial.
Declaremos una cadena con varios caracteres Unicode.
import unicodedata
stringVal = u"Här är ett exempel på en svensk mening att ge dig."
print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "ignore"))
Después de llamar al método normalize()
, encadena una llamada a la función encode()
, que hace la conversión de Unicode a ASCII.
El carácter u
antes del valor de la cadena ayuda a Python a reconocer que el valor de la cadena contiene caracteres Unicode; esto se hace por motivos de seguridad de tipos.
El primer parámetro especifica el tipo de conversión y el segundo parámetro impone lo que se debe hacer si un carácter no se puede convertir. En este caso, el segundo parámetro pasa ignore
, que ignora cualquier carácter que no se pueda convertir.
Producción :
b'Har ar ett exempel pa en svensk mening att ge dig.'
Observe que los caracteres Unicode de la cadena original (ä
y å
) han sido reemplazados por su contraparte de caracteres ASCII (a
).
El símbolo b
al comienzo de la cadena denota que la cadena es un byte literal ya que la función encode()
se usa en la cadena. Para eliminar el símbolo y las comillas simples que encapsulan la cadena, entonces llame en cadena a la función decode()
después de llamar a encode()
para volver a convertirla en una cadena literal.
print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "ignore").decode())
Producción :
Har ar ett exempel pa en svensk mening att ge dig.
Probemos otro ejemplo usando el replace
como segundo parámetro en la función encode()
.
Para este ejemplo, probemos una cadena que tiene caracteres que no tienen contrapartes ASCII.
import unicodedata
stringVal = u"áæãåāœčćęßßßわた"
print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "replace").decode())
Todos los caracteres de esta cadena de ejemplo no están registrados en ASCII, pero pueden tener un símbolo equivalente.
Producción :
a??a?a?a??c?c?e??????
El parámetro replace
reemplaza directamente los caracteres sin contrapartes ASCII con un signo de interrogación ?
símbolo. Si usáramos ignore
en la misma cadena:
print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "ignore").decode())
La salida será:
aaaacce
En resumen, para convertir caracteres Unicode en caracteres ASCII, use la función normalize()
del módulo unicodedata
y la función incorporada encode()
para cadenas. Puede ignore
o replace
los caracteres Unicode que no tienen homólogos ASCII. La opción ignore
eliminará el carácter y la opción replace
lo reemplazará con signos de interrogación.
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn