2009-06-19 14 views
2

In PHP würde ich verwenden:Methode zum Ersetzen von fremden für englische Zeichen in Java?

$text = "Je prends une thé chaud, s'il vous plaît"; 
$search = array('é','î','è'); // etc. 
$replace = array('e','i','e'); // etc. 
$text = str_replace($search, $replace, $text); 

Aber die Java String-Methode "ersetzen" scheint nicht Arrays als Eingabe zu akzeptieren. Gibt es eine Möglichkeit, dies zu tun (ohne auf eine for-Schleife zurückgreifen zu müssen, um durch das Array zu gehen)?

Bitte sagen Sie, wenn es eine elegantere Methode als die Methode gibt, die ich versuche.

Antwort

1

Du wirst eine Schleife zu tun haben:

String text = "Je prends une thé chaud, s'il vous plaît"; 
Map<Character, String> replace = new HashMap<Character, String>(); 
replace.put('é', "e"); 
replace.put('î', "i"); 
replace.put('è', "e"); 
StringBuilder s = new StringBuilder(); 
for (int i=0; i<text.length(); i++) { 
    char c = text.charAt(i); 
    String rep = replace.get(c); 
    if (rep == null) { 
    s.append(c); 
    } else { 
    s.append(rep); 
    } 
} 
text = s.toString(); 

Hinweis: Einige Zeichen mit mehreren Zeichen ersetzt werden. Im Deutschen wird zum Beispiel u-umlaut in "ue" umgewandelt.

Bearbeiten: Es viel effizienter gemacht.

+0

Außer in Java. (Sorry, konnte nicht widerstehen.) –

+0

Ugh. Bitte verwenden Sie nicht die Regexp-basierte Methode dafür. –

+0

Auf den zweiten Blick, ich nehme an, Sie müssen, wenn Sie einzelne Zeichen durch mehrere ersetzen wollen, aber ich bin mir nicht sicher, ob das OP das will. Es müsste auf lokaler Ebene implementiert werden und wahrscheinlich in einem ad-hoc-Durcheinander enden - ich glaube nicht, dass alle Sprachen klare Regeln für die Ersetzung akzentuierter Zeichen wie Deutsch haben. –

0

Sie erhalten eine Schleife benötigen.

Map<Character, Character> map = new HashMap<Character, Character>(); 
    map.put('é', 'e'); 
    map.put('î', 'i'); 
    map.put('è', 'e'); 

    StringBuilder b = new StringBuilder(); 
    for (char c : text.toCharArray()) 
    { 
     if (map.containsKey(c)) 
     { 
      b.append(map.get(c)); 
     } 
     else 
     { 
      b.append(c); 
     } 
    } 
    String result = b.toString(); 

Natürlich in einem realen Programm, das Sie sowohl den Aufbau der Karte und den Austausch in ihren jeweiligen Methoden kapseln würde:

Eine effiziente Lösung wäre so etwas wie die folgenden sein.

2

Es gibt keine Methode, die mit der PHP-API in der Standard-API identisch ist, auch wenn Apache Commons möglicherweise etwas enthält. Sie könnten es tun, indem Sie die Zeichen ersetzt einzeln:

s = s.replace('é','e').replace('î', 'i').replace('è', 'e'); 

Eine anspruchsvollere Methode, die erfordert Sie nicht die Zeichen aufzuzählen zu ersetzen (und ist somit eher nichts zu verpassen), sondern eine Schleife erfordert (die wird sowieso intern passieren, egal welche Methode Sie verwenden) wäre java.text.Normalizer zu verwenden, um Buchstaben und diakritische Zeichen zu trennen und dann alles mit einem Zeichentyp von Character.MODIFIER_LETTER auszublenden.

3

Ein wirklich netter Weg ist die Verwendung der replaceEach() method from the StringUtils Klasse in Apache Commons Lang 2.4.

String text = "Je prends une thé chaud, s'il vous plaît"; 
String[] search = new String[] {"é", "î", "è"}; 
String[] replace = new String[] {"e", "i", "e"}; 
String newText = StringUtils.replaceEach(text, 
       search, 
       replace); 

Ergebnisse in

Je prends une the chaud, s'il vous plait 
+2

Es lohnt sich selten, eine Bibliotheksabhängigkeit für eine Funktion hinzuzufügen, die trivial zu implementieren ist. – cletus

+3

Trivial zu implementieren, vielleicht nicht so trivial zu testen. Wenn Sie eine Bibliothek verwenden, die so häufig verwendet wird wie commons-lang, können Sie einigermaßen sicher sein, dass sie gut funktioniert. –

+2

Man könnte genauso gut sagen, dass es sich selten lohnt, ein Dienstprogramm erneut zu implementieren (das Hinzufügen von mehr eigenem Code zum Testen und Warten), wenn in einer weit verbreiteten Bibliothek bereits eine vollkommen gute Implementierung existiert. – Jonik

2

bin ich kein Java Kerl, aber ich würde eine generische Lösung mit der Normalizer class zu akzentuierte Zeichen zu zersetzen und entfernen Sie dann die Unicode „KOMBINATION“ Zeichen empfehlen.

+0

Michael Borgwardt erwähnt, Character.MODIFIER_LETTER chars. Welches ist es, oder meintest du eigentlich das Gleiche? – Jonik

+0

+1 Interessant! – starblue

+1

Formal die Unicode-Kategorie Lm, der Character.MODIFIER_LETTER entspricht. Das ist klar, was hier benötigt wird: http://www.dpawson.co.uk/xsl/rev2/UnicodeCategories.html. Kategorie Mc "Mark, spacing combining" scheint nur für bestimmte asiatische Sprachen zu gelten. –

Verwandte Themen