Entwickler-Ecke

IO, XML und Registry - Problem mit StreamReader, Encoding und deutschen Umlauten


PoiSoN - Di 19.02.08 12:00
Titel: Problem mit StreamReader, Encoding und deutschen Umlauten
Hallo zusammen,

ich hoffe, dieses Forum ist richtig. Hier erstmal ein Stückchen Code:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
            String command;
            String stdOut;
            String stdErr;
            int exitCode;

            // ...

            System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
            myProcess.StartInfo.UseShellExecute = false;
            myProcess.StartInfo.CreateNoWindow = true;
            myProcess.StartInfo.RedirectStandardOutput = true;
            myProcess.StartInfo.RedirectStandardError = true;
            myProcess.StartInfo.FileName = "cmd.exe";
            myProcess.StartInfo.Arguments = "/C " + command;
            myProcess.EnableRaisingEvents = true;
            try
            {
                myProcess.Start();
                System.IO.StreamReader sOut = myProcess.StandardOutput;
                System.IO.StreamReader sErr = myProcess.StandardError;
                
                // Encoding eng = sOut.CurrentEncoding;
                stdOut = sOut.ReadToEnd();
                stdErr = sErr.ReadToEnd();

                myProcess.WaitForExit();
                exitCode = myProcess.ExitCode;

                sErr.Close();
                sOut.Close();
                myProcess.Close();
            }
            catch ...


Ich lese den Output ein, den mir eine aufgerufene Exe-Datei zurückliefert.
Mein Problem ist, dass die deutschen Umlaute dabei falsch eingelesen werden.
Als Encoding wird automatisch Windows-1252 genommen, und laut http://en.wikipedia.org/wiki/Windows-1252 enthält das Encoding auch ä, ö, ü (und ß).
Allerdings wird ä nun zu ", ö zu ", ü zu einem Kästchen und ß zu á beim Auslesen.

Anstatt

C#-Quelltext
1:
System.IO.StreamReader sOut = myProcess.StandardOutput;                    

würde ich gerne so etwas machen wie

C#-Quelltext
1:
System.IO.StreamReader sOut = new StreamReader(myProcess.StandardOutput, Encoding.XYZ);                    

um mal noch andere Encodings durchzuprobieren, was aber leider nicht geht, da myProcess.StandardOutput schon einen StreamReader liefert, der Constructor von StreamReader aber als ersten Parameter z.B. einen Stream erwartet...

Könnt ihr mir sagen, wie ich einem StreamReader ein spezielles Encoding mitgeben kann?
Oder muss das vielleicht erst bei stdOut = sOut.ReadToEnd(); gemacht werden? Nur wie?

Freue mich auf Antwort :)
Viele Grüße
PoiSoN


Kha - Di 19.02.08 14:19

Das Encoding wird auf die Codepage der Konsole festgelegt, sollte also eigentlich passen. Folgendes funktioniert auch bei mir:

C#-Quelltext
1:
2:
3:
4:
var process = Process.Start(new ProcessStartInfo("cmd""/C echo hällo") {
  RedirectStandardOutput = true,
  UseShellExecute = false});
Console.WriteLine(process.StandardOutput.ReadToEnd());


[edit]
Mit einer zweiten Exe funktioniert es ebenfalls. Aber wozu überhaupt der Umweg über cmd /C? Starte doch einfach direkt die zweite Exe.


PoiSoN - Di 19.02.08 15:52

Der Umweg über cmd, weil der Start eines neuen Prozesses bei mir eine eigene Funktion ist und verschiedene Sachen damit aufgerufen werden, also andere Exe-Dateien, aber auch z.B. Python-Scripte usw. Und mit myProcess.StartInfo.FileName = "cmd.exe"; wollte ich es sozusagen allgemeingültig machen ohne jedes Mal erst angeben zu müssen, was womit aufgerufen werden soll. Weil das OS ja weiß, mit welchem Programm z.B. Python-Scripte assoziiert sind.

Habe es jetzt so umgebaut, dass ich abfrage, ob diese zweite Exe ausgeführt werden soll; falls ja, soll er nicht über die Cmd gehen, ansonsten weiterhin ja. Beim Debuggen kriege ich aber leider immer noch bei stdOut = sOut.ReadToEnd(); die "kaputten" Umlaute angezeigt :(

Hast du vielleicht noch eine Idee?