Es hängt alles davon ab, wie Sie wirklich wollen, dass sich Ihr Algorithmus verhält.
Als Beispiel sei ( ʟᴇᴛᴛᴇʀ ᴀ gefolgt von U + 0308 ᴄᴏᴍʙɪɴɪɴɢ ᴅɪᴀᴇʀᴇsɪs U + 0061 ʟᴀᴛɪɴ sᴍᴀʟʟ), die Zeichenfolge "a\u0308"
zu berücksichtigen, die zu "ä"
oder "\u00e4"
kanonisch äquivalent ist (U + 00E4 s (s). Kanonisch äquivalent zu sein, bedeutet, dass Ihr Algorithmus nicht zwischen diesen beiden unterscheiden sollte. Eine einfache Möglichkeit, kanonisch äquivalente Strings zu erhalten, um sich gleich zu verhalten, besteht darin, die beiden auf das gleiche kanonische Normalisierungsformat zu normieren: entweder NFC oder NFD.
Je nachdem, was diese Zeichenfolgen darstellen, möchten Sie möglicherweise stattdessen die Kompatibilitätsäquivalenz (NFKC oder NFKD) verwenden. Dies wird allgemein beispielsweise für Kennungen empfohlen. Diese beiden konvertieren Kompatibilitätszeichen in ihre empfohlenen Äquivalente (wie U2126 S0 bis U3A9 oder Ligaturzeichen zu den Sequenzen von Zeichen, aus denen sie bestehen).
Unabhängig davon, welche Art von Äquivalenz Sie wollen, bleibt das Prinzip das gleiche: Wenn Sie äquivalente Strings gleichermaßen behandeln wollen, ist die Normalisierung beider Methoden der einfachste Weg.
Sobald Sie das gleiche Verhalten für alle äquivalenten Strings haben, müssen Sie ein anderes Problem betrachten: Wenn Sie alle "Zeichen [s], die [sind] kein Buchstabe oder eine Ziffer sind", was passiert mit Strings mit Buchstaben und Kombinationszeichen, wie "\u092C\u093F"
(U + 092C ᴅᴇᴠᴀɴᴀɢᴀʀɪ ʟᴇᴛᴛᴇʀ ʙᴀ gefolgt von U + 093F ᴅᴇᴠᴀɴᴀɢᴀʀɪ ᴠᴏᴡᴇʟ sɪɢɴ ɪ, sieht aus wie बि)? Dies sind zwei separate Codepunkte und U + 093F ist kein Buchstabe. Diese beiden bilden keine Normalisierungsform. Möchten Sie, dass die Kombinationszeichen gelöscht werden (was Sie mit ब zurücklässt) oder nicht?
Wenn das Löschen erfolgreich ist, können Sie Ihren aktuellen Algorithmus verwenden. Andernfalls möchten Sie wahrscheinlich über Graphem-Cluster iterieren, bei denen es sich grob um Sequenzen von Basiszeichen gefolgt von den Kombinationsmarken handelt.Sowohl Java als auch ICU bieten APIs zum Auffinden von Graphem-Clustern (Java nennt diese "Zeichenumbrüche").
Können Sie keine Tests für beide Fälle erstellen, d. H. Mit und ohne Normalisierung, und die Ergebnisse vergleichen? – Henrik