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