# Windows Shell Umlaute Problem



## Guest (8. Mrz 2008)

Moin,

ich bin gerade am Rand der Verzweiflung. Ich habe ein Programm mit Umlauten. Wenn ich das in der Windows Shell ausführe, werden die richtig als ä, ö, ü angezeigt. Jetzt will ich aber auch noch aus einer Datei Umlaute auslesen. Ich habe schon die ganzen Encoding-Sachen durch ohne Erfolg.

Unter Linux funktioniert alles bestens, aber diese Windows-Konsole bringt mich zum Wahnsinn.


```
class Testing

{

	public static void main(String[] args)

	{

		In.open("test.txt");

		String s = In.readFile();

		In.close();

		Out.println(s);

		Out.println("ü"); // verschieden Zeichen

	}

}
```


----------



## Wildcard (8. Mrz 2008)

Was ist deine Frage?


----------



## Guest (8. Mrz 2008)

Naja, wie schaffe ich es, dass in der Ausgabe die Umlaute angezeigt werden. Sowohl die aus der Datei als auch die im Quelltext.


----------



## Wildcard (8. Mrz 2008)

Die Windows Shell verwendet cp 1252.


----------



## Guest (8. Mrz 2008)

Ja, das habe ich auch schon gelesen und auch, dass sie Cp850 verwendet. Trotzdem funktioniert weder das eine noch das andere.


----------



## Wildcard (8. Mrz 2008)

Wenn deine Quelldatei in cp1252 abgespeichert ist und du darin ein System.out.println("ü"); machst, wirst du auch ein ü sehen.


----------



## Guest (8. Mrz 2008)

Ja, aber ich sehe nicht das "ü" aus der Datei.


----------



## Wildcard (8. Mrz 2008)

In welchem Encoding ist die Datei? Wie liest du sie ein? Wie gibst du sie aus?


----------



## Guest (8. Mrz 2008)

Also ich benutze als absoluter Java-Anfänger die In.java und die Out.java. Das Programm ist im ersten Beitrag von mir und die Datei, die ich einlesen möchte, ist test.txt.


----------



## Wildcard (8. Mrz 2008)

Das sind scheinbar ganz unterschiedliche Encodings.


----------



## Guest (8. Mrz 2008)

Ja, das eine ist WIndows und das andere sind DOS-Encodings, weil die Konsole ja anscheinend DOS-Kompatibilität hat. Ich habe nur alles in eine Datei geworfen, um nicht tausendmal alles zu ändern. So kann ich gleich prüfen, ob irgendetwas davon richtig angezeigt wird.

Die Datei habe ich schon in ANSI, UTF8 und DOS-Format (?) gespeichert, alles ohne Erfolg.


----------



## Der Müde Joe (8. Mrz 2008)

Willst du einfach öä etc in DOS sauber ausgeben?


```
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;


public class Testing {

	public static void main(String[] args) throws Exception{
		File file = new File("test.txt");
		
		StringBuilder sb = new StringBuilder();
		
		InputStream in = new BufferedInputStream(new FileInputStream(file));
		
		int buffer;
		while ( (buffer=in.read()) > 0 ){
			sb.append((char)buffer);
		}
		in.close();
				
		OutputStreamWriter osw = new OutputStreamWriter(System.out, Charset.forName("cp850"));
		
		osw.write(sb.toString());
		osw.flush();
		osw.close();
	}
}
```

EDIT:

dem steht natürlich die Variante gegenüber, bei welcher die ü nicht stimmen, dafür die " als ü durchgehen:

```
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;


public class Testing {

	public static void main(String[] args) throws Exception{
		File file = new File("test.txt");
		
		StringBuilder sb = new StringBuilder();
		
		InputStream in = new BufferedInputStream(new FileInputStream(file));
		
		InputStreamReader inr =  new InputStreamReader(in ,  Charset.forName("cp850"));
		
		int buffer;
		while ( (buffer=inr.read()) > 0 ){
			sb.append((char)buffer);
		}
		inr.close();
				
		OutputStreamWriter osw = new OutputStreamWriter(System.out, Charset.forName("cp850"));
		
		osw.write(sb.toString());
		osw.flush();
		osw.close();
	}
}
```


----------



## Guest (8. Mrz 2008)

"In DOS ausgeben" hört sich falsch an, aber so in etwa ja. An sich brauchte ich nur den OutputStreamWriter-Teil. Aber so ganz habe ich das trotz Erklärung nicht ganz verstanden.


----------



## Guest (8. Mrz 2008)

Edit: Also es funktioniert mit dem OutputStreamWriter, danke.

Aber die Funktion / das Objekt habe ich halt nicht verstanden.


----------



## Der Müde Joe (8. Mrz 2008)

grob kannst du dir es so Vorstellen.

Die Klasse kapselt den OutputStream. Wenn geschrieben wird, dann wird das geschriebene
zuerst in das gewollte Encoding verwandelt.

 -->Characters written to it are encoded into bytes using a specified charset.
und
Each invocation of a write() method causes the encoding converter to be invoked on the given character(s)


----------



## Guest (8. Mrz 2008)

Und warum funktioniert das nicht, wenn ich beim Kompilieren einfach "javac -encoding Cp850" schreibe?


----------



## Der Müde Joe (8. Mrz 2008)

Das spielt nur eine Rolle bei kompilieren. Sprich der Compiler erwartet ein Source-File mit entsprechendem Encoding


----------



## Guest (8. Mrz 2008)

Ah, besten Dank. Jetzt kann ich endlich weiter programmieren.


----------



## Der Müde Joe (8. Mrz 2008)

Um das Encoding der JVM zu ändern, müsstest du

java -Dfile.encoding=cp850 KlassennName

das so machen (bin nicht ganz 100% sicher, aber sollte stimmen)

EDIT:
jap..stimmt so...
dann geht auch ein
System.out.println("äö"); in der Shell


----------



## Guest (8. Mrz 2008)

Wahnsinn, du bist einfach brilliant & fantastisch. Herzlichen Dank. Da wäre ich nie drauf gekommen. Das spart mir dieses komplizierte OutputStreamWriter.


----------

