Frage von sako14, 63

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

}

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von KnusperPudding, Community-Experte für Java, 40

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");
Kommentar von sako14 ,

Vielen Dank! Eigentlich könnte ich auch nur Scanner s = new Scanner(System.in); machen oder ?

Kommentar von DarkxAxngel ,

Probieren hat noch keinem geschadet

Kommentar von sako14 ,

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.

Kommentar von KnusperPudding ,

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.

Kommentar von KnusperPudding ,

 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ß.

Kommentar von sako14 ,

Sehr ausführlich erklärt! Danke!

Antwort
von Gastnr007, 34

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))

Kommentar von KnusperPudding ,

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.

Kommentar von Gastnr007 ,

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)

Keine passende Antwort gefunden?

Fragen Sie die Community