Converti caratteri Unicode in stringa ASCII in Python

Rayven Esplanada 22 giugno 2021
Converti caratteri Unicode in stringa ASCII in Python

Caratteri Unicode è lo standard di codifica globale per i caratteri per tutte le lingue. A differenza di ASCII, che supporta solo un singolo byte per carattere, i caratteri Unicode estendono questa capacità a 4 byte, facendogli supportare più caratteri in qualsiasi lingua.

Questo tutorial mostra come convertire i caratteri Unicode in una stringa ASCII. L’obiettivo è rimuovere i caratteri che non sono supportati in ASCII o sostituire i caratteri Unicode con il loro carattere ASCII corrispondente.

Usa unicodedata.normalize() e encode() per convertire Unicode in una stringa ASCII in Python

Il modulo Python unicodedata fornisce un modo per utilizzare il database di caratteri in Unicode e funzioni di utilità che aiutano l’accesso, il filtraggio e la ricerca di questi caratteri molto più facilmente.

unicodedata ha una funzione chiamata normalize()che accetta due parametri, la forma normalizzata della stringa Unicode e la stringa data.

Esistono 4 tipi di forme Unicode normalizzate: NFC, NFKC, NFD e NFKD. Per saperne di più su questo, la documentazione ufficiale è prontamente disponibile per una spiegazione completa e approfondita per ogni tipo. Il modulo normalizzato NFKD verrà utilizzato durante questo tutorial.

Dichiariamo una stringa con più caratteri 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"))

Dopo aver chiamato il metodo normalize(), concatena una chiamata alla funzione encode(), che esegue la conversione da Unicode ad ASCII.

Il carattere u prima del valore della stringa aiuta Python a riconoscere che il valore della stringa contiene caratteri Unicode; questo viene fatto per scopi di sicurezza del tipo.

Il primo parametro specifica il tipo di conversione e il secondo parametro impone cosa dovrebbe essere fatto se un carattere non può essere convertito. In questo caso, il 2° parametro passa ignore, che ignora qualsiasi carattere che non può essere convertito.

Produzione:

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

Si noti che i caratteri Unicode della stringa originale (ä e å) sono stati sostituiti con la sua controparte in caratteri ASCII (a).

Il simbolo b all’inizio della stringa denota che la stringa è un byte letterale poiché la funzione encode() è usata sulla stringa. Per rimuovere il simbolo e le virgolette singole che incapsulano la stringa, quindi chiamare a catena la funzione decode() dopo aver chiamato encode() per riconvertirla in una stringa letterale.

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

Produzione:

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

Proviamo un altro esempio usando replace come secondo parametro nella funzione encode().

Per questo esempio, proviamo una stringa con caratteri che non hanno controparti ASCII.

import unicodedata

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

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

Tutti i caratteri all’interno di questa stringa di esempio non sono registrati in ASCII ma possono avere un simbolo di controparte.

Produzione:

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

Il parametro replace sostituisce completamente i caratteri senza controparti ASCII con un punto interrogativo ? simbolo. Se dovessimo usare ignore sulla stessa stringa:

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

L’output sarà:

aaaacce

Riassumendo, per convertire i caratteri Unicode in caratteri ASCII, usa la funzione normalize() dal modulo unicodedata e la funzione encode() incorporata per le stringhe. Puoi ignore o replace i caratteri Unicode che non hanno controparti ASCII. L’opzione ignore rimuoverà il carattere e l’opzione replace lo sostituirà con punti interrogativi.

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

Articolo correlato - Python Unicode

Articolo correlato - Python String