Frage

Das problem ist, dass, wie Sie wissen, gibt es Tausende von Zeichen im Unicode-Diagramm und ich will wandeln Sie alle ähnlichen Zeichen auf den Buchstaben sind im englischen alphabet.

Zum Beispiel, hier sind ein paar Umbauten:

ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...

und ich sah, dass es mehr als 20 Versionen der Buchstabe A/A.und ich weiß nicht, wie Sie zu klassifizieren.Sie sehen aus wie Nadeln im Heuhaufen.

Die vollständige Liste der unicode-Zeichen ist auf http://www.ssec.wisc.edu/~tomw/java/unicode.html oder http://unicode.org/charts/charindex.html .Versuchen Sie einfach nach unten scrollen und sehen Sie die Varianten der Buchstaben.

Wie konvertiere ich all diese mit Java?Bitte helft mir :(

War es hilfreich?

Lösung

Umbuchen meinem Beitrag von Wie kann ich entfernen diakritische Zeichen (Akzente) aus einem String in .NET?

Diese Methode funktioniert in Java (nur zum Zweck diakritische Zeichen aka Akzente zu entfernen) .

Es wandelt grundsätzlich alle Zeichen mit Akzent in ihre deAccented Kollegen durch ihre Kombination von diakritischen Zeichen gefolgt. Jetzt können Sie einen regulären Ausdruck verwenden, um die diakritischen Zeichen abzustreifen.

import java.text.Normalizer;
import java.util.regex.Pattern;

public String deAccent(String str) {
    String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD); 
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
    return pattern.matcher(nfdNormalizedString).replaceAll("");
}

Andere Tipps

Es ist ein Teil von Apache Commons Lang wie von ver. 3.0.

org.apache.commons.lang3.StringUtils.stripAccents("Añ");

kehrt An

Siehe auch http: //www.drillio. com / en / Software-Entwicklung / java / Entfernen-Akzent-diakritische Zeichen-in-any-Sprache /

Der Versuch, „wandeln sie alle“ ist der falsche Ansatz für das Problem.

Zunächst müssen Sie die Einschränkungen verstehen, was Sie zu tun versuchen. Wie andere haben darauf hingewiesen, sind diakritische es für einen Grund: sie sind im Wesentlichen einzigartige Buchstaben im Alphabet dieser Sprache mit ihrem eigenen Sinne / Ton etc .: diese Marken zu entfernen als Ersatz für zufällige Buchstaben in einem englischen Wort genau das gleiche ist. Dies ist, bevor Sie selbst die kyrillischen Sprachen und andere Schriften mit Texten wie Arabisch geht auf prüfen, die einfach nicht „umgewandelt“ auf Englisch sein.

Wenn Sie muss , für welchen Gründen auch immer, konvertieren Zeichen, dann die einzige vernünftige Weg, dies es zu nähern, zunächst zu verringern den Umfang der Aufgabe. Betrachten Sie die Quelle des Eingangs - wenn Sie eine Anwendung Codierung für „die westliche Welt“ (als gut, eine Phrase wie jeder zu verwenden), wäre es unwahrscheinlich, dass Sie jemals arabische Zeichen analysieren müssen. In ähnlicher Weise enthält der Unicode-Zeichensatz Hunderte von mathematischen und Bildsymbolen. Es gibt keine (leicht) Art und Weise für die Benutzer direkt dieser eingeben, so können Sie davon ausgehen, können sie ignoriert werden

diese logischen Schritte Indem können Sie die Anzahl der möglichen Zeichen reduzieren bis zu dem Punkt, wo ein Wörterbuch basiert Lookup / Ersetzen-Operation möglich zu analysieren ist. Es wird dann eine kleine Menge von leicht Arbeit langweilig die Wörterbücher und eine triviale Aufgabe, die Schaffung des Ersatz durchzuführen. Wenn Ihre Sprache nativen Zeichen Unicode unterstützt (wie Java funktioniert) und optimiert die statischen Strukturen korrekt, so finden und ersetzt neigen blendend schnell zu sein.

Das kommt von Erfahrung auf einer Anwendung gearbeitet, die erforderlich war, Endnutzern zu ermöglichen bibliographische Daten zu suchen, die diakritischen Zeichen enthielten. Der Lookup-Arrays (wie es in unserem Fall war) nahm vielleicht einen Mann Tag zu produzieren, alle diakritischen Zeichen für alle westeuropäischen Sprachen abzudecken.

Da die Codierung, die „die Familie“ in „tђє Ŧ ค 3 เ ly“ wird effektiv zufällig und nicht jeder Algorithmus folgen, die durch die Information des Unicode erklärt werden kann Codepunkte beteiligt sind, gibt es keine allgemeine Art und Weise diese algorithmisch zu lösen .

Sie müssen die Zuordnung von Unicode-Zeichen in lateinische Buchstaben bauen, die sie ähneln. Sie könnten wahrscheinlich mit einigen intelligenten maschinellen Lernens auf den tatsächlichen Glyphen tun dies die Unicode-Codepunkte darstellt. Aber ich denke, der Aufwand für diesen größer wäre als von Hand, dass die Zuordnung zu bauen. Vor allem, wenn Sie eine gute Menge von Beispielen, aus denen Sie Ihr Mapping aufbauen können.

Zur Klarstellung:. Einige der Substitutionen kann tatsächlich über die Unicode-Daten gelöst werden (wie die anderen Antworten zeigen), aber einige Briefe haben einfach keine vernünftige Verbindung mit den lateinischen Schriftzeichen, die sie ähneln

Beispiele:

  • "ђ" (U + 0452 CYRILLIC SMALL LETTER DJE) ist mehr im Zusammenhang mit "d" als zu "H", werden aber verwendet, um "h".
  • "T" (U + 0166 LATIN CAPITAL LETTER T MIT HUB) ist etwas zu "T" im Zusammenhang (wie der Name schon sagt), sondern wird verwendet, um "F".
  • "ค" (U + 0E04 THAI CHARACTER KHO Khwai) verwandt ist nicht auf einen lateinischen Buchstaben überhaupt und in Ihrem Beispiel wird verwendet, "a" darstellen

Die ursprüngliche Anfrage wurde bereits beantwortet.

Aber ich bin Entsendung der unten Antwort für diejenigen, die für generische Umschrift Code könnte suchen jede charset auf Latein / Englisch in Java zu transkribieren.

Naive Bedeutung von tranliteration: Übersetzt Zeichenfolge in seiner endgültigen Form / Ziel-charset ist klingt wie die Saite in seiner ursprünglichen Form ist. Wenn wir keine charset auf Latein (Englisch Alphabete) transkribieren wollen, dann ICU4 (ICU4J Bibliothek in Java) wird die Arbeit tun.

Hier ist der Code-Schnipsel in Java:

    import com.ibm.icu.text.Transliterator; //ICU4J library import

    public static String TRANSLITERATE_ID = "NFD; Any-Latin; NFC";
    public static String NORMALIZE_ID = "NFD; [:Nonspacing Mark:] Remove; NFC";

    /**
    * Returns the transliterated string to convert any charset to latin.
    */
    public static String transliterate(String input) {
        Transliterator transliterator = Transliterator.getInstance(TRANSLITERATE_ID + "; " + NORMALIZE_ID);
        String result = transliterator.transliterate(input);
        return result;
    }

Wenn die Notwendigkeit besteht, konvertieren „òéışöç-> oeisoc“, können Sie diese als Ausgangspunkt verwendet werden:

public class AsciiUtils {
    private static final String PLAIN_ASCII =
      "AaEeIiOoUu"    // grave
    + "AaEeIiOoUuYy"  // acute
    + "AaEeIiOoUuYy"  // circumflex
    + "AaOoNn"        // tilde
    + "AaEeIiOoUuYy"  // umlaut
    + "Aa"            // ring
    + "Cc"            // cedilla
    + "OoUu"          // double acute
    ;

    private static final String UNICODE =
     "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"             
    + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD" 
    + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177" 
    + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
    + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF" 
    + "\u00C5\u00E5"                                                             
    + "\u00C7\u00E7" 
    + "\u0150\u0151\u0170\u0171" 
    ;

    // private constructor, can't be instanciated!
    private AsciiUtils() { }

    // remove accentued from a string and replace with ascii equivalent
    public static String convertNonAscii(String s) {
       if (s == null) return null;
       StringBuilder sb = new StringBuilder();
       int n = s.length();
       for (int i = 0; i < n; i++) {
          char c = s.charAt(i);
          int pos = UNICODE.indexOf(c);
          if (pos > -1){
              sb.append(PLAIN_ASCII.charAt(pos));
          }
          else {
              sb.append(c);
          }
       }
       return sb.toString();
    }

    public static void main(String args[]) {
       String s = 
         "The result : È,É,Ê,Ë,Û,Ù,Ï,Î,À,Â,Ô,è,é,ê,ë,û,ù,ï,î,à,â,ô,ç";
       System.out.println(AsciiUtils.convertNonAscii(s));
       // output : 
       // The result : E,E,E,E,U,U,I,I,A,A,O,e,e,e,e,u,u,i,i,a,a,o,c
    }
}

Die JDK 1.6 bietet die java.text.Normalizer-Klasse, die für diese Aufgabe verwendet werden kann.

Sehen Sie ein Beispiel hier

String getestet: ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß

Im Test:

Die letzte Wahl ist die beste.

Sie könnten versuchen, mit unidecode, die als ruby-gem und als perl-Modul auf cpan.Im wesentlichen funktioniert es wie eine riesige lookup-Tabelle, in der jedes unicode-code-Punkt bezieht sich auf einen ascii-Zeichen oder einen string.

Es gibt keine einfache oder allgemeine Art und Weise zu tun, was Sie wollen, weil es einfach Ihre subjektive Meinung ist, dass diese Buchstaben aussehen loke die lateinischen Buchstaben Sie konvertieren mögen. Sie sind tatsächlich einzelne Buchstaben mit ihren eigenen eindeutigen Namen und Klängen, die nur oberflächlich wie ein lateinischer Buchstaben aussehen passieren.

Wenn Sie diese Umwandlung wollen, müssen Sie Ihre eigene Übersetzungstabelle erstellen, basierend auf welcher lateinischen Buchstaben denken Sie, das nicht-lateinischen Buchstaben zu konvertiert werden sollen.

(Wenn Sie nur diacritial Markierungen entfernen möchten, gibt es einige Antworten zu diesem Thema: Wie kann ich diakritische Zeichen (Akzente) aus einem String in .NET entfernen? auch immer Sie ein allgemeineres Problem beschreiben)

Ich bin zu der Party zu spät, aber nachdem dieses Problem heute konfrontiert, fand ich diese Antwort sehr gut sein:

String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD)
    .replaceAll("[^\\p{ASCII}]", "");

Referenz: https://stackoverflow.com/a/16283863

Das Problem mit beliebigen Unicode in ASCII „Umwandlung“ ist, dass die Bedeutung eines Zeichens ist kulturabhängig. Zum Beispiel: „ß“ zu einer deutschsprachigen Person umgewandelt werden sollte „ss“, während ein Englisch-Lautsprecher wären es wahrscheinlich konvertieren „B“.

Hinzu kommt die Tatsache, dass Unicode mehrere Codepunkte für die gleichen Glyphen hat.

Das Ergebnis ist, dass der einzige Weg, dies zu tun, ist eine massive Tabelle mit jedem Zeichen Unicode erstellen und dem ASCII-Zeichen, das Sie es konvertieren mögen. Sie können eine Abkürzung nehmen von Zeichen mit Akzenten Normalisierung Form KD zu einer Normalisierung, aber nicht alle Zeichen in ASCII normalisieren. Darüber hinaus definieren ist Unicode nicht, welche Teile eines Glyphen sind „Akzente“.

Hier ist ein kleiner Auszug aus einer App, das dies tut:

switch (c)
{
    case 'A':
    case '\u00C0':  //  À LATIN CAPITAL LETTER A WITH GRAVE
    case '\u00C1':  //  Á LATIN CAPITAL LETTER A WITH ACUTE
    case '\u00C2':  //  Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    // and so on for about 20 lines...
        return "A";
        break;

    case '\u00C6'://  Æ LATIN CAPITAL LIGATURE AE
        return "AE";
        break;

    // And so on for pages...
}

Nach Klasse funktioniert der Trick:

org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilter
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top