Einlesen einer Textdatei mit umlauten geht nicht (ä = � )

Hallo,

Ich hab ein Problem beim einlesen einer Datei!

Ich lese die Datei Zeile für Zeile auf folgende Weise ein:

                    BufferedReader br = new BufferedReader(new FileReader(file));
                    String line;
                    while((line = br.readLine()) != null) {
                         System.out.println(line);
                    }
                    br.close();

Ausgabe einer test-Datei:


Hallo,

Dieser Text geht noch!

Aber das passiert bei Umlauten: �(ae), �(oe) oder �(ue)!

Weiß jemand wie so ein Fehler zustande kommen kann oder muss ich noch irgendetwas angeben, damit der FileReader das vernünftig einließt?

Danke für eure Hilfe!

willkommen in der Welt des Wahnsinns:

Du musst beim Öffnen der Datei angeben welches encoding er verwenden soll.

Und dafür musst du einen Reader verwenden, bei dem du Charsets angeben kannst.
Das kannst du z. B. machen mit …
Reader reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8.name());
Oder mit …
Scanner sc = new Scanner(new FileInputStream(file), StandardCharsets.UTF_8.name())

Die anderen Reader verwenden immer den Standard deines Betriebssystems, und das kann halt manchmal falsch sein.

Und dass hast Du noch das Problem, dass die Dos-Box nicht UTF-8 spricht, falls Du das Programm mal aus der IDE entlassen willst…

bye
TT

Hab jetzt den Scanner verwandt, aber die Ausgabe bleibt leider dieselbe ;(
������
Hab es so gemacht:

                    Scanner sc = new Scanner(new FileInputStream(file), StandardCharsets.UTF_8.name());
                    String line;
                    while((line = sc.nextLine()) != null) {
                        System.out.println(line);
                    }```
Gibt es vielleicht noch eine andere Art die Datei einzulesen oder mache ich in meinem Code irgendwas falsch?

Die Frage ist, welches Charset verwendet deine Textdatei denn? Öffne die mal mit einem vernünftigen Editor (Notepad++), der zeigt dir das unten rechts in der Leiste an. In meinem Beispiel habe ich jetzt einfach nur mal UTF-8 gewählt…

edit: Mit dem Scanner kannst du das übrigens komfortabler Einlesen:

{
    System.out.println(sc.nextLine());
}```

Danke für das mit dem Scanner.

Unten rechts in der Leiste steht “Dos\Windows | ANSI | INS”!
Ändert das irgendetwas?

ja - versuch mal ein Windows Encoding, z.B. „Windows-1252“ oder ein Anderes

*** Edit ***

falls Du Firefox nutzt bekommst du eine grobe Liste über das Menü: „Ansicht“ → „Zeichenkodierung“ → „Weitere“ → „Westeuropäisch“

Jo, wobei mir das komisch erscheint. Theoretisch müsste er das als Standard wählen, und das hat ja bei ihm irgendwie nicht funktioniert.

Scanner sc = new Scanner(new FileInputStream(new File("C:/test.txt")), "Windows-1252");

jaein - Windows wechselt alle Nase lang irgendwo das Encoding (anstatt es einmal richtig zu machen). Wenn ich mit Unison die Projekte zwischen Windows 7 und Linux abgleiche stolpert Windows über das Encoding. Ich muss ständig darauf achten das ich keine Umlaute verwende. Lustig wird es wenn ich Dateien vom Kunden bekomme - da kann ich nicht einfach den Buchstaben ändern (gerade wenn es mit SVN zusammen hängt).

Grundsätzlich ist es ungünstig irgendwo auf die Default-Einstellung von irgendwas zurück zu greifen (egal ob Win/X/Mac/…). Ich nagle immer alles fest. Ich habe mal von XP (Server) Zeichenketten an Win (Client) übertragen. Im Grund wurde das BS vom Client ausgetauscht (neuer Rechner). Das Programm lief nicht mehr, weil ich die Zeichenkette mit den Default-Encoding bearbeitet habe. Gleiches dann nochmal von 1.1 auf 2.0. Zumindest das Encoding nagle ich inzwischen immer auf UTF-8 fest.

das problem ist weniger das einlesen des files als viel mehr das encoding der ausgabe

es ist leider so das sowohl CMD.exe als auch die PowerShell standardmäßig CP850 nutzen
java intern hingegen unicode/UTF8
und das file selbst wie du geschrieben hast Win-ANSI (WIN1252)

wie gesagt : der wahnsinn des encodings

um jetzt auf CMD.exe mit CP850 eine “korrekte” ausgabe zu erhalten musst du deinem code sagen das er auch eine CP850 ausgabe machen soll

folgender code demonstriert das sehr gut

public class Test
{
	public static void main(String[] args) throws Exception
	{
		System.out.println("ä");
		PrintStream ps=new PrintStream(System.out, true, "CP850");
		ps.println("ä");
	}
}```
unter Win7 ist die ausgabe folgende

õ
ä


vor der korrektur des charsets wird also das "ä" was im source steht "zerstört"
nach anpassung auf das ausgabe-enconding bekommt man dann die korrekte ausgabe

das du für das einlesen keine anpassung vornehmen musst liegt daran das java normalerweise für streams den platform-charset nutzt, und das ist unter windows nun mal Win-1252, was dem encoding des files entspricht




[ot]
ich weis zwar nicht was der code in deiner signatur soll, aber man kann ihn auf den einzeiler verkürzen
```setVisible(!isVisible());```
eine vorherige abfrage ob true oder false ist unnötig wenn du als ergebnis eh ein toggle machst
denn du hast ja sowohl im if als auch im else die exakt gleiche zeile stehen