Das Problem ist, dass, wie Sie wissen, das Unicode-Diagramm Tausende von Zeichen enthält und ich alle ähnlichen Zeichen in die Buchstaben des englischen Alphabets konvertieren möchte.
Zum Beispiel hier ein paar Konvertierungen:
ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...
und ich habe gesehen, dass es mehr als 20 Versionen von Buchstabe A / a gibt. und ich weiß nicht, wie ich sie klassifizieren soll. Sie sehen aus wie Nadeln im Heuhaufen.
Die vollständige Liste der Unicode-Zeichen finden Sie unter http://www.ssec.wisc.edu/~tomw/java/unicode.html oder http://unicode.org/charts/charindex.html . Scrollen Sie einfach nach unten und sehen Sie die Variationen der Buchstaben.
Wie kann ich all dies mit Java konvertieren? Bitte hilf mir :(
java
unicode
special-characters
diacritics
AhmetB - Google
quelle
quelle
Antworten:
Reposting my post from Wie entferne ich diakritische Zeichen (Akzente) aus einer Zeichenfolge in .NET?
Diese Methode funktioniert gut in Java (nur zum Entfernen diakritischer Zeichen, auch Akzente genannt) .
Grundsätzlich werden alle Zeichen mit Akzent in ihre Gegenstücke mit Akzent umgewandelt, gefolgt von ihren kombinierten Diakritika. Jetzt können Sie eine Regex verwenden, um die Diakritika zu entfernen.
quelle
Es ist ein Teil von Apache Commons Lang ab Version. 3.0.
kehrt zurück
An
Siehe auch http://www.drillio.com/de/software-development/java/removing-accents-diacritics-in-any-language/
quelle
Der Versuch, "alle zu konvertieren", ist die falsche Herangehensweise an das Problem.
Zunächst müssen Sie die Einschränkungen dessen verstehen, was Sie versuchen zu tun. Wie andere bereits betont haben, gibt es Diakritika aus einem Grund: Es handelt sich im Wesentlichen um eindeutige Buchstaben im Alphabet dieser Sprache mit eigener Bedeutung / Ton usw. Das Entfernen dieser Zeichen ist genau das gleiche wie das Ersetzen zufälliger Buchstaben in einem englischen Wort. Dies ist, bevor Sie sich überhaupt mit den kyrillischen Sprachen und anderen skriptbasierten Texten wie Arabisch befassen, die einfach nicht in Englisch "konvertiert" werden können.
Wenn Sie aus irgendeinem Grund Zeichen konvertieren müssen, ist dies der einzig sinnvolle Weg, um zunächst den Umfang der vorliegenden Aufgabe zu verringern. Betrachten Sie die Quelle der Eingabe - wenn Sie eine Anwendung für "die westliche Welt" codieren (um eine so gute Phrase wie jede andere zu verwenden), ist es unwahrscheinlich, dass Sie jemals arabische Zeichen analysieren müssen. In ähnlicher Weise enthält der Unicode-Zeichensatz Hunderte von mathematischen und bildlichen Symbolen: Es gibt keine (einfache) Möglichkeit für Benutzer, diese direkt einzugeben, sodass Sie davon ausgehen können, dass sie ignoriert werden können.
Mit diesen logischen Schritten können Sie die Anzahl der möglichen zu analysierenden Zeichen so weit reduzieren, dass eine wörterbuchbasierte Such- / Ersetzungsoperation möglich ist. Es wird dann zu einer kleinen Menge etwas langweiliger Arbeit beim Erstellen der Wörterbücher und zu einer trivialen Aufgabe, den Austausch durchzuführen. Wenn Ihre Sprache native Unicode-Zeichen unterstützt (wie Java) und statische Strukturen korrekt optimiert, sind solche Suchen und Ersetzen in der Regel unglaublich schnell.
Dies beruht auf der Erfahrung, an einer Anwendung gearbeitet zu haben, die erforderlich war, damit Endbenutzer bibliografische Daten mit diakritischen Zeichen durchsuchen konnten. Die Erstellung der Lookup-Arrays (wie in unserem Fall) dauerte vielleicht 1 Manntag, um alle diakritischen Zeichen für alle westeuropäischen Sprachen abzudecken.
quelle
Da die Codierung, die "die Familie" in "tђє Ŧ Ŧ ๓ เ ℓy" verwandelt, effektiv zufällig ist und keinem Algorithmus folgt, der durch die Informationen der beteiligten Unicode-Codepunkte erklärt werden kann, gibt es keine allgemeine Möglichkeit, dies algorithmisch zu lösen.
Sie müssen die Zuordnung von Unicode-Zeichen zu lateinischen Zeichen erstellen, denen sie ähneln. Sie könnten dies wahrscheinlich mit intelligentem maschinellem Lernen an den tatsächlichen Glyphen tun, die die Unicode-Codepunkte darstellen. Aber ich denke, der Aufwand dafür wäre größer als das manuelle Erstellen dieses Mappings. Vor allem, wenn Sie eine gute Anzahl von Beispielen haben, aus denen Sie Ihr Mapping erstellen können.
Zur Verdeutlichung: Einige der Substitutionen können tatsächlich über die Unicode-Daten gelöst werden (wie die anderen Antworten zeigen), aber einige Buchstaben haben einfach keine vernünftige Assoziation mit den lateinischen Zeichen, denen sie ähneln.
Beispiele:
quelle
Die ursprüngliche Anfrage wurde bereits beantwortet.
Ich poste jedoch die folgende Antwort für diejenigen, die möglicherweise nach generischem Transliterationscode suchen, um Zeichensätze in Java auf Latein / Englisch zu transliterieren.
Naive Bedeutung der Übersetzung: Übersetzte Zeichenfolge in ihrer endgültigen Form / Zielzeichensatz klingt wie die Zeichenfolge in ihrer ursprünglichen Form. Wenn wir einen Zeichensatz ins Lateinische (englische Alphabete) übersetzen möchten, erledigt ICU4 (ICU4J-Bibliothek in Java) die Aufgabe.
Hier ist das Code-Snippet in Java:
quelle
Saite getestet: ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß
Geprüft :
Die letzte Wahl ist die beste.
quelle
Wenn "òéışöç-> oeisoc" konvertiert werden muss, können Sie dies als Ausgangspunkt verwenden:
Das JDK 1.6 stellt die Klasse java.text.Normalizer bereit, die für diese Aufgabe verwendet werden kann.
Sehen Sie ein Beispiel hier
quelle
Sie können versuchen
unidecode
, das zu verwenden , das als Ruby Gem und als Perl-Modul auf cpan erhältlich ist . Im Wesentlichen funktioniert es als riesige Nachschlagetabelle, in der sich jeder Unicode-Codepunkt auf ein ASCII-Zeichen oder eine ASCII-Zeichenfolge bezieht.quelle
Es gibt keine einfache oder allgemeine Möglichkeit, das zu tun, was Sie wollen, da es nur Ihre subjektive Meinung ist, dass diese Buchstaben wie die lateinischen Buchstaben aussehen, in die Sie konvertieren möchten. Es sind eigentlich getrennte Buchstaben mit ihren eigenen Namen und Lauten, die nur oberflächlich wie ein lateinischer Buchstabe aussehen.
Wenn Sie diese Konvertierung wünschen, müssen Sie eine eigene Übersetzungstabelle erstellen, die darauf basiert, in welche lateinischen Buchstaben die nicht-lateinischen Buchstaben Ihrer Meinung nach konvertiert werden sollen.
(Wenn Sie nur diakritische Zeichen entfernen möchten, gibt es in diesem Thread einige Antworten: Wie entferne ich diakritische Zeichen (Akzente) aus einer Zeichenfolge in .NET? Sie beschreiben jedoch ein allgemeineres Problem.)
quelle
Ich bin zu spät zur Party, aber nachdem ich mich heute diesem Problem gestellt habe, fand ich diese Antwort sehr gut:
Referenz: https://stackoverflow.com/a/16283863
quelle
Das Problem beim "Konvertieren" von beliebigem Unicode in ASCII besteht darin, dass die Bedeutung eines Zeichens kulturabhängig ist. Zum Beispiel sollte "ß" für eine deutschsprachige Person in "ss" konvertiert werden, während ein Englisch sprechender es wahrscheinlich in "B" konvertieren würde.
Hinzu kommt, dass Unicode mehrere Codepunkte für dieselben Glyphen hat.
Das Ergebnis ist, dass der einzige Weg, dies zu tun, darin besteht, eine massive Tabelle mit jedem Unicode-Zeichen und dem ASCII-Zeichen zu erstellen, in das Sie es konvertieren möchten. Sie können eine Verknüpfung verwenden, indem Sie Zeichen mit Akzenten zur Normalisierung von KD normalisieren, aber nicht alle Zeichen werden zu ASCII normalisiert. Außerdem definiert Unicode nicht, welche Teile eines Glyphen "Akzente" sind.
Hier ist ein kleiner Auszug aus einer App, die dies tut:
quelle
Die folgende Klasse macht den Trick:
quelle