# Effizientes Ersetzen von Umlauten



## Guybrush Threepwood (23. Sep 2009)

Hi,
ich muss für die Generierung eines Reports aus Datenbank-Daten die Umlaute und Sonderzeichen durch Unicode ersetzen und habe dafür die folgende Methode:

```
/**
	 * convenience method for replacing german umlauts with html unicode codes
	 * 
	 * @param text
	 *            the text to compute
	 * @return the altered text
	 */
	public static String replaceUmlauts(String text) {
		return text.replaceAll("ä", "ä").replaceAll("Ä", "Ä")
				.replaceAll("ö", "ö").replaceAll("Ö", "Ö")
				.replaceAll("ü", "ü").replaceAll("Ü", "Ü")
				.replaceAll("ß", "ß").replaceAll("é", "é")
				.replaceAll("ë", "ë").replaceAll("è", "è")
				.replaceAll("ê", "ê").replaceAll("ô", "ô")
				.replaceAll("À", "À").replaceAll("Å", "Å")
				.replaceAll("Á", "Á").replaceAll("Â", "Â")
				.replaceAll("Ç", "Ç").replaceAll("È", "È")
				.replaceAll("É", "É").replaceAll("Ê", "Ê")
				.replaceAll("Ë", "Ë").replaceAll("à", "à")
				.replaceAll("á", "á").replaceAll("â", "â")
				.replaceAll("å", "å").replaceAll("æ", "æ")
				.replaceAll("ç", "ç").replaceAll("Ô", "Ô")
				.replaceAll("Ã", "Ã").replaceAll("ã", "ã")
				.replaceAll("Ã", "Ã").replaceAll("ã", "ã")
				.replaceAll("Ñ", "Ñ").replaceAll("ñ", "ñ")
				.replaceAll("Õ", "Õ").replaceAll("õ", "õ")
				.replaceAll("Æ", "Æ").replaceAll("ò", "ò")
				.replaceAll("ó", "ó").replaceAll("ø", "ø")
				.replaceAll("Ò", "Ò").replaceAll("Ó", "Ó")
				.replaceAll("Ø", "Ô").replaceAll("ì", "ì")
				.replaceAll("í", "í").replaceAll("î", "î")
				.replaceAll("Ì", "Ì").replaceAll("Í", "Í")
				.replaceAll("Î", "Î").replaceAll("ù", "ù")
				.replaceAll("ú", "ú").replaceAll("û", "û")
				.replaceAll("Ù", "Ù").replaceAll("Ú", "Ú")
				.replaceAll("“", "“").replaceAll("”", "”")
				.replaceAll("„", "„").replaceAll("‚", "‚")
				.replaceAll("’", "’").replaceAll("‘", "‘")
				.replaceAll("—", "—").replaceAll("–", "–");
	}
```
Zwar funktioniert sie und ich bemerkte auch keine PErformanzprobleme, aber so ganz schlau ist das vermutlich nicht, oder? Die ganzen .replaceAll() nehmen bestimmt unnötig viel Rechenleistung in Anspruch. Gibt es eine Möglichkeit das schlauer zu lösen?

P.S.: Die Unicode-Zeichen im Code-Beispiel werden leider automatisch im Forum als Sonderzeichen angezeigt, deswegen die Methode im Anhang noch einmal als Text.


----------



## bygones (23. Sep 2009)

a) wenn es keine Performanceprobleme gibt sollte man auch keine Loesung fuer Performanceprobleme suchen
b) kannst du apache.common.langs (muesste es sein) nutzen . Deren StringUtils klasse hat diverse konvergierunsmethoden - wie das implementiert ist keine ahnung

Aber wie gesagt - wenn es keine Probleme gibt sollte man nicht nach Loesungen suchen


----------



## SlaterB (23. Sep 2009)

und wer doch sucht:
kürzer wäre zunächst einmal, die zusammengehörigen Werte in ein Array oder so zu schreiben und dann 
in einer for-Schleife alles zu durchlaufen,

das ist kürzer und handlicher und erspart eventuelle Probleme durch die extreme Verkettung der Methodenaufrufe,
zu denen es aber anscheinend nicht kommt

----

dann wäre es wahrscheinlich performanter,
aus dem String einmal ein char-Array zu machen, dieses genau einmal zu durchlaufen, 
und jeden char x entweder direkt in einen neuen StringBuilder einzufügen oder ersatzweise eine Menge anderer chars, falls x zu ersetzen ist,

da x ein char ist, also ein Zahlwert, kann man recht schön direkt in einem Array nachschauen, ob da derselbe char bzw. String steht oder ein anderer,
hierfür bräuchtest du also einmalig ein recht großes Array, bis zu 65.000 Einträge lang

quasi:
for (char i im String) {
builder.append(stringArray_);
}_


----------



## Guybrush Threepwood (23. Sep 2009)

Ah, ok. Ich habe mir mal Apache Commons Lang (org.apache.commons.lang.Entities) angesehen und dort speichert man alle Sonderzeichen in einer Map, und geht dann mit einem Writer über den String und ersetzt alle Zeichen, deren Key in der Map sind.


----------

