Ihre spezifischen Anforderungen sind etwas vage, aber ich nehme an, Sie etwas wollen, das tut, was Normalizer tut, aber mit dem Merkmal einen Topf zu werfen bestimmte Unicode-Codepunkte auf ein Zeichen - ähnlich wie utf8proc.
ich gehen würde, für einen 2-Schritt-Ansatz:
- Erster Einsatz Normalizer.normalize zu schaffen, was auch immer (de-) Zusammensetzung Sie
- dann durch die Codepunkte des Ergebnisses durchlaufen und ersetzen Sie die Zeichen vereinigen so wie es dir gefällt.
Beide sollten einfach sein. Wenn Sie sich mit Zeichen aus dem Basic Multilingual Pane befassen, durchlaufen Sie für 2 die Codepunkte mit einem appropriate algorithm for doing so. Wenn Sie nur BMP-Codepunkte verwenden, durchlaufen Sie einfach die Zeichen.
Für die Zeichen, die Sie über einen Kamm scheren möchten, erstellen Sie eine Substitutionsdatenstruktur für das Mapping ununified Codepunkt ->einheitliche Code-Punkt. Map<Character, Character>
oder Map<Integer, Integer>
dafür in den Sinn kommen. Füllen Sie die Ersatzkarte nach Ihren Wünschen, z. indem man die Information von utf8procs klump.txt und eine Quelle für character categories nimmt.
Map<Character, Character> LUMP;
static {
LUMP = new HashMap<Character, Character>();
LUMP.put('\u2216', '\\'); // set minus
LUMP.put('\u007C', '|'); // divides
// ...
}
Erstellen Sie einen neuen StringBuilder oder etwas ähnliches mit der gleichen Größe wie Ihre normalisierte Zeichenfolge. Überprüfen Sie bei der Iteration über die Codepunkte, ob LUMP.get(codePoint)
nicht null ist. Fügen Sie in diesem Fall den zurückgegebenen Wert hinzu, andernfalls fügen Sie den Codepunkt zum StringBuilder hinzu. Das sollte es sein.
Bei Bedarf können Sie eine Möglichkeit zum Laden des Inhalts von LUMP aus einer Konfiguration unterstützen, z. von einem Properties Objekt.
PS: Sieht aus wie ich es implementieren muss. Irgendwelche Ideen, wie es geht? – valodzka