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