Как прочитать специальные символы (0x80 ... 0x9F) из консоли Windows в C #? - PullRequest
1 голос
/ 29 октября 2011

Я наконец решил проблему записи специальных символов (0x80 ... 0x9F) в консоль Windows с помощью David :

  1. Выходная кодировка должна быть установлена ​​в UTF-8.
  2. Шрифт, используемый консолью, должен быть похож на Consolas.

Теперь я хотел бы иметь возможность читать обратно текст, который содержит специальные символы в диапазоне 0x80-0x9F (с использованием кодировки Windows 1252), например знак EURO (€):

string text = System.Console.ReadLine ();

возвращает null всякий раз, когда я набираю один из специальных символов. Я наивно пытался установить InputEncoding в UTF8:

System.Console.InputEncoding = System.Text.Encoding.UTF8;

но это не помогает.

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Вы можете установить входную кодовую страницу вашего консольного приложения для чтения этих специальных символов. Существует Win32 API под названием SetConsoleCP, чтобы установить кодовую страницу ввода. В следующем примере я использую кодовую страницу Windows-1252:

[DllImport("kernel32.dll")]
private static extern bool SetConsoleCP(uint wCodePageID);

static void Main(string[] args)
{
  SetConsoleCP((uint)1252);
  Console.OutputEncoding = Encoding.UTF8;
  System.Console.Out.WriteLine("œil"); 

  string euro = Console.In.ReadLine();

  Console.Out.WriteLine(euro);
}

EDIT:

AS L.B. предложил также использовать Console.InputEncoding = Encoding.GetEncoding (1252).

Вот полный пример без взаимодействия (обратите внимание, вы также можете использовать кодовую страницу Windows-1252 для кодировки вывода:

static void Main(string[] args)
{
  Console.InputEncoding  = Encoding.GetEncoding(1252);
  Console.OutputEncoding = Encoding.GetEncoding(1252);
  System.Console.Out.WriteLine("œil"); 

  string euro = Console.In.ReadLine();

  Console.Out.WriteLine(euro);
}

КОНЕЦ РЕДАКТИРОВАНИЯ

Надеюсь, это поможет.

0 голосов
/ 29 октября 2011

Знак евро (€): Unicode 0x20ac также UTF-8, последовательность байтов 0xE2 0x82 0xAC. не диапазон 0x80-0x9F.

char Euro = Convert.ToChar(0x20ac);
Console.WriteLine(Euro);
Console.WriteLine(Convert.ToChar(0x80));

введите в командной строке

>csc sample.cs
>chcp 65001

Изменение шрифта TrueTypeFont (выберите «Consoleas» или «Lucida Console») в окне командной строки (вкладка шрифта)

>sample
€
?

(?: заключено в квадрат). код charactor проверяет регистр палитры шрифтов 0x80-0x9F. Ему не присвоен шрифт с поддержкой Unicode.

...