"Der Parameter ist falsch" beim Einstellen von Unicode als Konsolencodierung
Frage
Ich bekomme den folgenden Fehler:
Unhandled Exception: System.IO.IOException: The parameter is incorrect.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.__Error.WinIOError()
at System.Console.set_OutputEncoding(Encoding value)
at (my program)
Wenn ich die folgende Codezeile ausführe:
Console.OutputEncoding = Encoding.Unicode;
Irgendeine Idee warum? Ich erhalte diesen Fehler nicht, wenn ich die Codierung stattdessen auf UTF8 festlegt.
Lösung
Coding.unicode ist UTF-16, das 2 Bytes verwendet, um alle Zeichen zu codieren. Die ASCII-Zeichen (englische Zeichen) sind in UTF-8 (einzelne Bytes, gleiche Werte) gleich. Deshalb kann dies der Grund sein, warum es funktioniert.
Ich vermute, dass die Windows -Befehlsschale Unicode nicht vollständig unterstützt. Komisch, dass die PowerShell 2-GUI UTF-16 (soweit ich weiß) unterstützt, aber das Programm macht dort die gleiche Ausnahme.
Der folgende Code funktioniert, was zeigt, dass das Konsolenobjekt seine Ausgabe weiterleitet und codieren.unicode unterstützt:
FileStream testStream = File.Create("test.txt");
TextWriter writer = new StreamWriter(testStream, Encoding.Unicode);
Console.SetOut(writer);
Console.WriteLine("Hello World: \u263B"); // unicode smiley face
writer.Close(); // flush the output
Andere Tipps
Nach der Liste von Code -Seiten -Kennungen auf MSDN, Die UTF-16- und UTF-32-Kodierungen werden nur verwaltet:
1200 utf-16 Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications
1201 unicodeFFFE Unicode UTF-16, big endian byte order; available only to managed applications
12000 utf-32 Unicode UTF-32, little endian byte order; available only to managed applications
12001 utf-32BE Unicode UTF-32, big endian byte order; available only to managed applications
Beispielsweise werden sie in der Registrierung nicht mit den anderen Systemcodeseiten unter hkey_local_maachine system currentControlset control nls Codepage aufgeführt.
Ich denke, es hat mit dem zu tun CodePage
des Encoding
du benutzt. Insbesondere sehen SetConsoleOutputCP -Funktion. Ich weiß nicht viel mehr, sorry.
Bearbeiten: Ich habe den Verweis auf die gemeldet SetConsoleOutputCP
Da diese Funktion intern (durch Pinvoke) durch den (festgelegten Betrieb von) genannt wird Console.OutputEncoding
.