Maison >développement back-end >Tutoriel Python >Comment le module « unicodedata » de Python peut-il normaliser les chaînes Unicode pour une manipulation cohérente ?

Comment le module « unicodedata » de Python peut-il normaliser les chaînes Unicode pour une manipulation cohérente ?

DDD
DDDoriginal
2024-12-01 02:05:09156parcourir

How Can Python's `unicodedata` Module Normalize Unicode Strings for Consistent Manipulation?

Normalisation d'Unicode

Le module unicodedata de Python fournit des méthodes pour manipuler les chaînes Unicode. Une tâche courante consiste à normaliser une chaîne afin qu'elle utilise la représentation la plus simple possible, en éliminant les entités Unicode en double.

Problème

Considérez l'exemple suivant :

import unicodedata

char = "á"
len(char)
[unicodedata.name(c) for c in char]

Le résultat montre que la chaîne "á" est normalisée à sa forme la plus simple : "LETTRE MINUSCULE LATINE A AVEC AIGU". Cependant, si l'on inverse l'ordre des caractères :

char = "á"
len(char)
[unicodedata.name(c) for c in char]

Le résultat se décompose en deux caractères distincts : « LETTRE MINUSCULE LATINE A » et « ACCENT AIGU COMBINANT ». Ce comportement est incohérent et peut compliquer la manipulation des chaînes.

Solution

Pour normaliser une chaîne Unicode de manière cohérente, utilisez la fonction .normalize() du module unicodedata. Le formulaire NFC (Normal Form Composed) renvoie des caractères composés, tandis que le formulaire NFD (Normal Form Decomposed) vous donne des caractères décomposés et combinés.

Par exemple, en utilisant la même combinaison Unicode ci-dessus :

print(ascii(unicodedata.normalize('NFC', '\u0061\u0301')))
print(ascii(unicodedata.normalize('NFD', '\u00e1')))

Le résultat montre que le formulaire NFC produit le caractère composé "é", tandis que le formulaire NFD produit la séquence décomposée. "au0301".

Des formulaires supplémentaires, NFKC et NFKD, traitent des points de code de compatibilité. Ces formes remplacent les caractères de compatibilité par leur forme canonique. Par exemple :

unicodedata.normalize('NFKC', '\u2167')

Transforme le point de code huit en chiffre romain (U 2167) en séquence ASCII "VIII".

Notez que toutes les transformations ne sont pas commutatives. Décomposer un caractère composé puis le recomposer peut ne pas aboutir à la séquence originale. La norme Unicode maintient une liste d'exceptions pour ce comportement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn