Konvertieren von Symbolen, Akzentbuchstaben in das englische Alphabet

Lesezeit: 5 Minuten

Konvertieren von Symbolen Akzentbuchstaben in das englische Alphabet
ahmet alp balkan

Das Problem ist, dass es, wie Sie wissen, Tausende von Zeichen gibt in der Unicode-Tabelle und ich möchte alle ähnlichen Zeichen in die Buchstaben des englischen Alphabets umwandeln.

Hier sind zum Beispiel ein paar Konvertierungen:

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

und ich habe gesehen, dass es mehr als 20 Versionen des Buchstabens A/a gibt. und ich weiß nicht, wie ich sie einordnen 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 . Versuchen Sie einfach, nach unten zu scrollen, und sehen Sie sich die Variationen der Buchstaben an.

Wie kann ich das alles mit Java umwandeln? Bitte hilf mir 🙁

  • Siehe diese Frage: stackoverflow.com/questions/249087/… – es sollte auch einige andere Fragen zu diesem Thema geben, aber ich kann sie im Moment nicht finden.

    – schnaader

    17. Juni 09 um 18:36 Uhr

  • Sollte Ihr drittes Beispiel Ȳ → Y sein?

    – Mürrischer hoher Bogen

    17. Juni 09 um 19:42 Uhr

  • Warum willst du das tun? Wenn wir wüssten, was Ihr Gesamtziel war, könnten wir möglicherweise hilfreicher sein.

    – David Thornley

    17. Juni 09 um 20:01 Uhr

  • David, du weißt, dass einige EMOs unterschiedliche Zeichen in Sätzen verwenden. Hier ein Beispiel: ฬ.¢. tђє ฬยη∂єг¢คקђ Ŧค๓เℓy <-- Lösen Sie dies :) @schnaader, ich denke, das ist, wonach ich suche, aber nicht in Java.

    – ahmet alp balkan

    17. Juni 09 um 20:04 Uhr

  • Dieses Gespräch wurde schon einmal geführt – siehe @schnaader oben.

    – dkretz

    17. Juni 09 um 20:07 Uhr

Konvertieren von Symbolen Akzentbuchstaben in das englische Alphabet
hashbar

Neuposten meines Beitrags von Wie entferne ich diakritische Zeichen (Akzente) aus einer Zeichenfolge in .NET?

Diese Methode funktioniert gut in Java (rein zum Entfernen von diakritischen Zeichen, auch bekannt als Akzente).

Es konvertiert im Grunde alle Zeichen mit Akzent in ihre Gegenstücke mit deAccent, gefolgt von ihren kombinierten diakritischen Zeichen. Jetzt können Sie eine Regex verwenden, um die diakritischen Zeichen zu entfernen.

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("");
}

  • InCombiningDiacriticalMarks konvertiert nicht alle kyrillischen Zeichen. Zum Beispiel ist Општина Богомила unberührt. Es wäre schön, wenn man es in Opstina Bogomila oder so umwandeln könnte

    – iwein

    14. Mai ’10 um 15:47 Uhr

  • Es transkribiert überhaupt nicht. Es entfernt lediglich zerlegte diakritische Zeichen (“Akzente”). Der vorherige Schritt (Form.NFD) zerlegt á in ein + ‘, dh zerlegt das Zeichen mit Akzent in ein Zeichen ohne Akzent plus ein diakritisches Zeichen. Dies würde das kyrillische Ѽ in Ѡ umwandeln, aber nicht weiter.

    – MSalter

    28. Juli 10 um 10:44 Uhr

  • George hat gepostet, dass es besser sein könnte, \p{IsM} statt \p{InCombiningDiacriticalMarks} zu verwenden glaforge.appspot.com/article/… Beachten Sie, dass ich es nicht getestet habe.

    – Atorras

    26. März 2012 um 09:42 Uhr

  • \p{IsM} scheint nicht für spanische Akzente wie á ó ú ñ é í zu funktionieren. Im Gegenteil, “\p{InCombiningDiacriticalMarks}+ funktioniert gut dafür

    – Loic

    5. März 13 um 9:23 Uhr


  • Es funktioniert nicht für alle Sonderzeichen – ich habe ein falsches Problem für Android eingereicht, um das zu erfahren -> code.google.com/p/android/issues/detail?id=189515 Weiß jemand, wie man das richtig macht?

    – Michal Tajchert

    11. Januar 16 um 17:50 Uhr

1644319752 148 Konvertieren von Symbolen Akzentbuchstaben in das englische Alphabet
Ondra Žižka

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

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

kehrt zurück An

Siehe auch http://www.drillio.com/en/software-development/java/removing-accents-diacritics-in-any-language/

  • Diese Lösung ist erstaunlich. Es funktioniert auch mit Griechisch! Danke schön.

    – Tom

    25. September 14 um 18:49 Uhr

  • Es ist nicht perfekt für polnische Zeichen Übersetzung von ł und Ł fehlt: Eingabe: ŚŻÓŁĄĆĘŹąółęąćńŃ Ausgabe: SZOŁACEZaołeacnN

    – Robert

    21. August 16 um 11:03 Uhr

  • Nettes Dienstprogramm, aber da sein Code genau derselbe ist wie der in der akzeptierten Antwort gezeigte und Sie keine Abhängigkeit von Commons Lang hinzufügen möchten, können Sie einfach das oben genannte Snippet verwenden.

    – Polarett

    24. Januar 17 um 15:51 Uhr

  • bei Apache in meinem Fall üblich: © nicht nach D konvertieren

    – Hoang

    20. September 17 um 7:07 Uhr

  • @Hoang, Robert vielleicht eine Chance, eine Pull-Anfrage zu senden 🙂

    – Ondra Žižka

    20. September 17 um 16:24 Uhr

Konvertieren von Symbolen Akzentbuchstaben in das englische Alphabet
Jan

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

Zunächst müssen Sie die Grenzen dessen, was Sie zu tun versuchen, verstehen. Wie andere betont haben, gibt es diakritische Zeichen aus einem bestimmten Grund: Sie sind im Wesentlichen eindeutige Buchstaben im Alphabet dieser Sprache mit ihrer eigenen Bedeutung / ihrem eigenen Klang usw.: Das Entfernen dieser Zeichen ist genauso wie das Ersetzen zufälliger Buchstaben in einem englischen Wort. Dies, bevor Sie überhaupt die kyrillischen Sprachen und andere schriftbasierte Texte wie Arabisch in Betracht ziehen, die einfach nicht ins Englische “konvertiert” werden können.

wenn du muss, aus welchen Gründen auch immer, Zeichen umzuwandeln, dann ist die einzig sinnvolle Herangehensweise, zunächst den Umfang der anstehenden Aufgabe zu reduzieren. Berücksichtigen Sie die Quelle der Eingabe – wenn Sie eine Anwendung für “die westliche Welt” codieren (um einen so guten Ausdruck zu verwenden), ist es unwahrscheinlich, dass Sie jemals arabische Zeichen analysieren müssen. Ebenso 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.

Indem Sie diese logischen Schritte unternehmen, können Sie die Anzahl der möglichen zu analysierenden Zeichen bis zu dem Punkt reduzieren, an dem ein wörterbuchbasierter Such-/Ersetzungsvorgang möglich ist. Es wird dann zu einer kleinen, etwas langweiligen Arbeit, die Wörterbücher zu erstellen, und zu einer trivialen Aufgabe, die Ersetzung durchzuführen. Wenn Ihre Sprache native Unicode-Zeichen unterstützt (wie es Java tut) und statische Strukturen korrekt optimiert, sind solche Suchen und Ersetzen in der Regel unglaublich schnell.

Dies ergibt sich aus der Erfahrung mit der Arbeit an einer Anwendung, die es Endbenutzern ermöglichen sollte, bibliografische Daten zu durchsuchen, die diakritische Zeichen enthielten. Die Lookup-Arrays (wie in unserem Fall) dauerten vielleicht 1 Manntag, um alle diakritischen Zeichen für alle westeuropäischen Sprachen abzudecken.

  • iAn danke für die Antwort. Eigentlich arbeite ich nicht mit arabischen Sprachen oder ähnlichem. Sie wissen, dass einige Leute die diakritischen Zeichen als lustige Zeichen verwenden, und ich muss das so weit wie möglich entfernen. Zum Beispiel habe ich im Beispiel die Konvertierung “tђє Ŧค๓เℓy –> the Family” gesagt, aber es scheint schwierig zu sein, sie vollständig zu konvertieren. Wir können jedoch die Konvertierung “òéışöç->oeisoc” auf einfache Weise vornehmen. Aber was ist der genaue Weg, dies zu tun. Arrays erstellen und manuell ersetzen? Oder hat diese Sprache native Funktionen zu diesem Thema?

    – ahmet alp balkan

    17. Juni 09 um 20:28 Uhr

1644319753 720 Konvertieren von Symbolen Akzentbuchstaben in das englische Alphabet
Joachim Sauer

Da die Codierung, die „die Familie“ in „tђє Ŧค๓เℓy“ verwandelt, praktisch 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 etwas 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 aufbauen können.

Zur Verdeutlichung: Einige der Ersetzungen 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:

  • „ђ“ (U+0452 Kyrillischer Kleinbuchstabe DJE) ist eher mit „d“ als mit „h“ verwandt, wird aber verwendet, um „h“ darzustellen.
  • „Ŧ“ (U+0166 LATEINISCHER GROSSBUCHSTABE T MIT STRICH) ist etwas verwandt mit „T“ (wie der Name schon sagt), wird aber verwendet, um „F“ darzustellen.
  • “ค” (U + 0E04 THAI CHARACTER KHO KHWAI) ist überhaupt nicht mit einem lateinischen Zeichen verwandt und wird in Ihrem Beispiel verwendet, um “a” darzustellen.

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

Geprüft :

Die letzte Wahl ist die beste.

  • @mehmet Folgen Sie einfach der Readme unter github.com/xuender/unidecode. Es sollte etwas wie Unidecode.decode(“ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß”) lauten, nachdem die Abhängigkeit importiert wurde.

    – Kakteen

    17. August 18 um 08:22 Uhr

  • Dies ist ein interessanter Test. Aber es wäre noch besser, wenn Sie aufschreiben würden, welche Methoden aus den verschiedenen Bibliotheken Sie verwenden!

    – Lii

    15. November 21 um 20:02 Uhr

Die ursprüngliche Anfrage wurde bereits beantwortet.

Ich poste jedoch die folgende Antwort für diejenigen, die nach einem generischen Transliterationscode suchen, um einen beliebigen Zeichensatz in Java in Latein / Englisch zu transliterieren.

Naive Bedeutung der Tranliteration: Übersetzter String in seiner endgültigen Form/Zielzeichensatz klingt wie der String in seiner ursprünglichen Form. Wenn wir einen beliebigen Zeichensatz in Latein (englische Alphabete) transliterieren möchten, erledigt ICU4 (ICU4J-Bibliothek in Java) die Aufgabe.

Hier ist das Code-Snippet 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;
    }

  • @mehmet Folgen Sie einfach der Readme unter github.com/xuender/unidecode. Es sollte etwas wie Unidecode.decode(“ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß”) lauten, nachdem die Abhängigkeit importiert wurde.

    – Kakteen

    17. August 18 um 08:22 Uhr

  • Dies ist ein interessanter Test. Aber es wäre noch besser, wenn Sie aufschreiben würden, welche Methoden aus den verschiedenen Bibliotheken Sie verwenden!

    – Lii

    15. November 21 um 20:02 Uhr

1644319753 92 Konvertieren von Symbolen Akzentbuchstaben in das englische Alphabet
RealHowTo

Wenn “òéışöç->oeisoc” konvertiert werden muss, können Sie dies als Ausgangspunkt verwenden:

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 =
     "u00C0u00E0u00C8u00E8u00CCu00ECu00D2u00F2u00D9u00F9"             
    + "u00C1u00E1u00C9u00E9u00CDu00EDu00D3u00F3u00DAu00FAu00DDu00FD" 
    + "u00C2u00E2u00CAu00EAu00CEu00EEu00D4u00F4u00DBu00FBu0176u0177" 
    + "u00C3u00E3u00D5u00F5u00D1u00F1"
    + "u00C4u00E4u00CBu00EBu00CFu00EFu00D6u00F6u00DCu00FCu0178u00FF" 
    + "u00C5u00E5"                                                             
    + "u00C7u00E7" 
    + "u0150u0151u0170u0171" 
    ;

    // 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
    }
}

Das JDK 1.6 stellt die java.text.Normalizer-Klasse bereit, die für diese Aufgabe verwendet werden kann.

Siehe ein Beispiel Hier

  • Leider wird das nicht mit Ligaturen wie Æ umgehen.

    – Mürrischer hoher Bogen

    17. Juni 09 um 23:07 Uhr

  • Diese Methode ist besonders nützlich, wenn Sie diakritische Zeichenklassen anders erkennen und handhaben müssen (zB Sonderzeichen in LaTeX maskieren).

    – Vallismortis

    1. Juni 18 um 13:04 Uhr


.

822070cookie-checkKonvertieren von Symbolen, Akzentbuchstaben in das englische Alphabet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy