Convertir caracteres Unicode en cadenas ASCII en Python

Rayven Esplanada 22 junio 2021
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.

Rayven Esplanada avatar Rayven Esplanada avatar

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

Artículo relacionado - Python Unicode

Artículo relacionado - Python String