Java Umlaute ersetzen Scanner?
Hi, ich verstehe nicht warum die Umlaute nicht ersetzt werden, sollte doch mit der replace() Methode funktionieren. Könnt ihr mir helfen ?
CODE:
Scanner s = new Scanner(System.in, "UTF-8");
System.out.println("Vorname: "); String vorname = s.nextLine().toLowerCase().replace("ä","ae").replace("ö", "oe").replace("ü","ue");
System.out.println("Nachname: "); String nachname = s.nextLine().toLowerCase().replace("ä","ae").replace("ö", "oe").replace("ü","ue");
System.out.println(nachname + "." + vorname + "@student.tgm.ac.at");
s.close();
}
}
2 Antworten
Sofern du Umlaute verwendest, wäre es vielleicht besser ein anderes Encoding beim Lesen der Daten zu verwenden:
Scanner s = new Scanner(System.in, "ISO-8859-1");
Ja hab ich ja schon probiert, klappt auch ^^ Nur wollte ich wissen für was man dieses Encoding braucht, weil in der Schule wurde uns das nicht erklärt.
Eigentlich könnte ich auch nur Scanner s = new Scanner(System.in); machen oder ?
In dem Falle wird da Standard-Charset verwendet, was nicht immer dasselbe sein muss je nach JavaVM und Rechner.
Explizit das Encoding anzugeben, halte ich durchaus für wichtig.
Ich persönlich hatte erst den Fall, dass ich deshalb einen Fehler auf Rechner B hatte, den ich auf Rechner A nicht nachvollziehen konnte, bis ich durch Zufall auf das Charset stieß.
Beim Encoding geht es darum, wie die erhaltenen Bytes interpretiert werden um daraus Lesbare Zeichen zu machen.
Dabei ist "kurz gesagt" Das ISO-8859-1" Encoding das "ältere". Dass eigentlich weniger Zeichen kennt als UTF-8.
Das Problem, was du hast: Die Konsole auf der du das eingibst ist mit ISO-8859-I kodiert. Wenn du diese aber nun mit UTF-8 liest, gibt es an einigen Stellen eben Differenzen, wie bei den Umlauten.
Vielleicht ist deine .java ja nicht UTF-8 sondern ANSI mit Umlauten? Versuch doch mal die \uHEX0 Kombinationen statt den reinen Zeichen. Du könntest du einfach eine Bestätigung zu haben dir ja auch mal die Charcodes ausgeben lassen ((int)DeinString.charAt(index))
Nur wenn der Scanner bereits die Zeichen beim lesen 'nicht versteht', wird es zu einem Problem...
Da mit UTF-8 gelesen wird, ist die Information bereits vor der 'Weiterverarbeitung' verloren, denn die Umlaute werden durch ein kryptisches Zeichen ersetzt, aus dem kein \uHEX mehr lesbar ist.
UTF-8 kann deutlich mehr Informationen halten als ISO-8859-1, da sollte nichts verloren gehen. (nein, es ist nicht auf 8Bits begrenzt, UTF-16 ist auf 16Bits begrenzt, aber UTF-8 geht bis 8Bytes mit dann 42Bits)
Vielen Dank! Eigentlich könnte ich auch nur Scanner s = new Scanner(System.in); machen oder ?