Heim >Backend-Entwicklung >Python-Tutorial >Wie kann das „unicodedata'-Modul von Python Unicode-Strings für eine konsistente Manipulation normalisieren?

Wie kann das „unicodedata'-Modul von Python Unicode-Strings für eine konsistente Manipulation normalisieren?

DDD
DDDOriginal
2024-12-01 02:05:09165Durchsuche

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

Unicode normalisieren

Das Unicodedata-Modul von Python bietet Methoden zum Bearbeiten von Unicode-Zeichenfolgen. Eine häufige Aufgabe besteht darin, eine Zeichenfolge so zu normalisieren, dass sie die einfachste mögliche Darstellung verwendet und doppelte Unicode-Entitäten eliminiert.

Problem

Betrachten Sie das folgende Beispiel:

import unicodedata

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

Das Ergebnis zeigt, dass die Zeichenfolge „á“ auf ihre einfachste Form normalisiert ist: „LATEINISCHER KLEINBUCHSTABE A MIT AKUTE“. Wenn wir jedoch die Reihenfolge der Zeichen umkehren:

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

Das Ergebnis wird in zwei separate Zeichen zerlegt: „LATIN SMALL LETTER A“ und „COMBINING ACUTE ACCENT“. Dieses Verhalten ist inkonsistent und kann die Zeichenfolgenmanipulation erschweren.

Lösung

Um eine Unicode-Zeichenfolge konsistent zu normalisieren, verwenden Sie die Funktion .normalize() aus dem Unicodedata-Modul. Das NFC-Formular (Normal Form Composed) gibt zusammengesetzte Zeichen zurück, während das NFD-Formular (Normal Form Decomposed) zerlegte, kombinierte Zeichen liefert.

Zum Beispiel mit der gleichen Unicode-Kombination wie oben:

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

Die Ausgabe zeigt, dass das NFC-Formular das zusammengesetzte Zeichen „é“ erzeugt, während das NFD-Formular die zerlegte Sequenz erzeugt „au0301“.

Zusätzliche Formen, NFKC und NFKD, befassen sich mit Kompatibilitätscodepunkten. Diese Formen ersetzen Kompatibilitätszeichen durch ihre kanonische Form. Zum Beispiel:

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

Transformiert den Codepunkt der römischen Zahl Acht (U 2167) in die ASCII-Sequenz „VIII“.

Beachten Sie, dass nicht alle Transformationen kommutativ sind. Das Zerlegen eines zusammengesetzten Zeichens und das anschließende erneute Zusammensetzen führt möglicherweise nicht zur ursprünglichen Reihenfolge. Der Unicode-Standard führt eine Liste von Ausnahmen für dieses Verhalten.

Das obige ist der detaillierte Inhalt vonWie kann das „unicodedata'-Modul von Python Unicode-Strings für eine konsistente Manipulation normalisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn