«Неверный параметр» при установке Unicode в качестве кодировки консоли - PullRequest
6 голосов
/ 07 января 2009

Я получаю следующую ошибку:

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)

когда я запускаю следующую строку кода:

 Console.OutputEncoding = Encoding.Unicode;

Есть идеи, почему? Я не получаю эту ошибку, если вместо этого установить кодировку UTF8.

Ответы [ 3 ]

4 голосов
/ 28 мая 2009

Encoding.Unicode - это UTF-16, который использует 2 байта для кодирования всех символов. Символы ASCII (английские символы) одинаковы в UTF-8 (отдельные байты, одинаковые значения), поэтому может быть, поэтому он работает.

Я предполагаю, что командная оболочка Windows не полностью поддерживает Unicode. Забавно, что графический интерфейс Powershell 2 поддерживает UTF-16 (насколько я знаю), но программа выдает там то же исключение.

Работает следующий код, который показывает, что объект Console может перенаправлять свои выходные данные и поддерживать Encoding.Unicode:

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
2 голосов
/ 16 июня 2009

Согласно списку Идентификаторы кодовой страницы в MSDN , кодировки UTF-16 и UTF-32 доступны только для управления:

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

Например, они не перечислены в реестре вместе с другими системными кодовыми страницами в HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Nls \ CodePage.

0 голосов
/ 07 января 2009

Я думаю, что это связано с CodePage из Encoding, который вы используете. В частности, см. Функция SetConsoleOutputCP . Я не знаю больше, извините.

Редактировать: Я сообщил о ссылке на SetConsoleOutputCP, потому что эта функция вызывается изнутри (через PInvoke) (операция set) Console.OutputEncoding.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...