2009-01-07 4 views
6

ich die folgende Fehlermeldung erhalten:„Der Parameter ist falsch“, wenn Unicode als Konsole Codierung Einstellung

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ühren:

Console.OutputEncoding = Encoding.Unicode; 

Jede Idee, warum? Ich bekomme diesen Fehler nicht, wenn ich die Kodierung stattdessen auf UTF8 setze.

Antwort

3

Encoding.Unicode ist UTF-16, die 2 Bytes verwendet, um alle Zeichen zu codieren. Die ASCII-Zeichen (englische Zeichen) sind in UTF-8 identisch (einzelne Bytes, gleiche Werte), daher könnte es auch funktionieren.

Meine Vermutung ist, dass die Windows-Befehlsshell Unicode nicht vollständig unterstützt. Komisch, dass die Powershell 2 GUI UTF-16 unterstützt (soweit ich weiß), aber das Programm löst dort die gleiche Ausnahme aus.

Der folgende Code funktioniert, die zeigt, dass die Konsole Objekt seinen Ausgang und Unterstützung Encoding.Unicode umgeleitet haben kann:

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 
0

Ich denke, es hat mit der CodePage der Encoding zu tun, die Sie verwenden. Siehe insbesondere SetConsoleOutputCP Function. Ich weiß nicht viel mehr, Entschuldigung.

Edit: Ich habe den Verweis auf die SetConsoleOutputCP gemeldet, weil diese Funktion intern aufgerufen wird (durch PInvoke) durch den (eingestellten Vorgang) Console.OutputEncoding.

1

Nach der Liste der Code Page Identifiers on MSDN, die UTF-16 und UTF-32-Codierungen verwaltet -nur:

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 

Zum Beispiel sind sie nicht in der Registrierung mit dem anderen Systemcodepages unter HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ NLS \ Codepage aufgeführt.