Wie behebe ich unterschiedliches Encoding in C# Anwendungen?
POV: ich habe eine C# Anwendung, die die Ausgabe von stdout und stderr von einer Konsolenanwendung ausliest:
consoleoutput = process.StandardOutput.ReadToEnd();
erroroutput = process.StandardError.ReadToEnd();
Benutze ich meine extra dafür gebaute Klasse in einer Konsolenanwendung (bzw. einem Testprojekt), werden Umlaute direkt so interpretiert wie sie ausgelesen wurden.
Benutze ich dieselbe Klasse und denselben Code in einer WinForms-Anwendung, wird die Ausgabe escaped (also "\u0081" statt "ü").
Das führt hier allerdings zu Folgeproblemen:
- Ich möchte die Ausgabe, die über die WinForms-Anwendung generiert wurde zum Verifizieren in meinem Testprojekt einlesen - bekomme hier aber zwei unterschiedlich encodete Strings, die sich natürlich nicht vergleichen lassen.
- Im einer WinForms Textbox werden die Umlaute einfach weggelassen, was ebenfalls unschön ist.
Wie bekomme ich es in der WinForms-Anwendung hin, dass sämtliche Umlaute exakt so erhalten bleiben wie in der Konsolenanwendung sichtbar ist?
2 Antworten
Die Konsole (und damit Konsolenanwendungen) und die grafische Oberfläche (und damit WinForms-Anwendungen) verwenden standardmäßig verschiedene Kodierungen (vermutlich ein Relikt aus der Windows-95-Zeit).
Da muss man die Kodierungen der Streams explizit angeben.
Auf die Schnelle habe ich einen Lösungsvorschlag hier gefunden: https://deviorel.wordpress.com/2015/01/16/getting-the-right-output-of-child-console-applications-in-c/
Wow, das hat funktioniert. Nachdem ich mit hin und her encoden/decoden des Strings selbst gefühlt ewig experimentiert habe, wäre ich nicht unbedingt auf die Idee gekommen, der Ausführung auf der Konsole selbst die Parameter mitzugeben. Manchmal tut's gut, einen Schritt zurück zu machen, weil man den Wald vor lauter Bäumen nicht sieht. Vielen Dank :)
Kodierungen kannst du mit der Encoding Klasse ändern.
Um z.B einen ASCII Text in UTF-8 umzuwandeln kannst du folgendes machen:
byte[] asciiBytes = Encoding.ASCII.GetBytes("Ein ASCII string.");
string utf8String = Encoding.UTF8.GetString(asciiBytes);
Vielen Dank für deine Antwort. Mit dem String-Encoding habe ich schon eine gefühlte Ewigkeit herumprobiert, bin aber iwie trotzdem nicht zu einer Lösung gekommen. Aber vielleicht ist die durch meine Unit Tests gesteuerte Konsolenanwendung auch etwas eigen, so dass deine Lösung wahrscheinlich überall anders, aber nur nicht hier funktioniert ;) Aber trotzdem vielen Dank für deine Antwort, vielleicht hilft sie ja doch noch jemand anderem.