Converter caracteres Unicode em string ASCII em Python

Rayven Esplanada 22 junho 2021
Converter caracteres Unicode em string ASCII em Python

Caracteres Unicode é o padrão de codificação global para caracteres de todos os idiomas. Ao contrário do ASCII, que suporta apenas um único byte por caractere, os caracteres Unicode estendem essa capacidade para 4 bytes, tornando-o compatível com mais caracteres em qualquer idioma.

Este tutorial demonstra como converter caracteres Unicode em uma string ASCII. O objetivo é remover os caracteres que não são suportados em ASCII ou substituir os caracteres Unicode por seus caracteres ASCII correspondentes.

Use unicodedata.normalize() e encode() para converter Unicode em string ASCII em Python

O módulo Python unicodedata fornece uma maneira de utilizar o banco de dados de caracteres em Unicode e funções utilitárias que ajudam a acessar, filtrar e pesquisar esses caracteres de maneira significativamente mais fácil.

unicodedata tem uma função chamada normalize()que aceita dois parâmetros, a forma normalizada da string Unicode e a string dada.

Existem 4 tipos de formulários Unicode normalizados: NFC, NFKC, NFD e NFKD. Para aprender mais sobre isso, a documentação oficial está prontamente disponível para uma explicação completa e detalhada para cada tipo. O formulário normalizado NFKD será usado ao longo deste tutorial.

Vamos declarar uma string com vários 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"))

Depois de chamar o método normalize(), encadeie uma chamada à função encode(), que faz a conversão de Unicode para ASCII.

O caractere u antes do valor da string ajuda o Python a reconhecer que o valor da string contém caracteres Unicode; isso é feito para fins de segurança de tipo.

O primeiro parâmetro especifica o tipo de conversão e o segundo parâmetro impõe o que deve ser feito se um caractere não puder ser convertido. Nesse caso, o segundo parâmetro passa por ignore, que ignora qualquer caractere que não possa ser convertido.

Resultado:

b'Har ar ett exempel pa en svensk mening att ge dig.'

Observe que os caracteres Unicode da string original (ä e å) foram substituídos por sua contraparte de caractere ASCII (a).

O símbolo b no início da string denota que a string é um byte literal, pois a função encode() é usada na string. Para remover o símbolo e as aspas simples que encapsulam a string, chame em cadeia a função decode() depois de chamar encode() para reconvertê-la em uma string literal.

print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "ignore").decode())

Resultado:

Har ar ett exempel pa en svensk mening att ge dig.

Vamos tentar outro exemplo usando replace como o segundo parâmetro na função encode().

Para este exemplo, vamos experimentar uma string com caracteres que não possuem contrapartes ASCII.

import unicodedata

stringVal = u"áæãåāœčćęßßßわた"

print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "replace").decode())

Todos os caracteres nesta string de exemplo não são registrados em ASCII, mas podem ter um símbolo correspondente.

Resultado:

a??a?a?a??c?c?e??????

O parâmetro replace substitui totalmente os caracteres sem contrapartes ASCII por um ponto de interrogação ? símbolo. Se fôssemos usar ignore na mesma string:

print(unicodedata.normalize("NFKD", stringVal).encode("ascii", "ignore").decode())

O resultado será:

aaaacce

Em resumo, para converter caracteres Unicode em caracteres ASCII, use a função normalize() do módulo unicodedata e a função interna encode() para strings. Você pode ignore ou replace os caracteres Unicode que não têm contrapartes ASCII. A opção ignore irá remover o caractere e a opção replace irá substituí-lo por pontos de interrogação.

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

Artigo relacionado - Python Unicode

Artigo relacionado - Python String