Чтение Юникода с помощью Console.ReadKey - PullRequest
2 голосов
/ 28 ноября 2008

Можно ли предоставить ввод Unicode для консольного приложения и прочитать символ / строку Unicode через Console.ReadKey ()?

Я знаю, что Unicode работает при чтении ввода другими методами, но, к сожалению, мне нужно использовать функцию «перехвата», предоставляемую ReadKey.

Обновление:

При вставке символа Unicode, такого как U + 03BB (λ), в консоль считываются 3 клавиши.

  1. Alt + NumPad1
  2. Alt + NumPad1
  3. Alt + NumPad8

Я пытался увидеть, является ли это какая-то кодировка, но ничего не вижу.

Ответы [ 3 ]

5 голосов
/ 30 ноября 2008

К сожалению, Console.ReadKey может обрабатывать только события клавиатуры. События клавиатуры могут представлять только то, что можно набирать на клавиатуре (используя действительные и «виртуальные» клавиши, определенные в перечислении ConsoleKey). Таким образом, при использовании ReadKey вы получите только две вещи: необработанный код клавиши, который соответствует клавише на клавиатуре, и переведенный символ, то есть символ Unicode, с которым код необработанного ключа сопоставляется на кодовой странице ввода консоли (и каждая кодовая страница может отображать не более 256 символов). С помощью ReadKey вы не можете читать данные любого другого типа (а именно символы, которые не могут быть набраны напрямую и / или не имеют сопоставления во входной кодовой странице).

Более того, когда вы вставляете символ Unicode в консоль, API, используемый ReadKey, пытается преобразовать символ в последовательность Windows ALT + nnn (то есть, удерживая нажатой клавишу ALT и введите номер кодовой точки на клавиатуре). К сожалению, он сначала переводит символ, используя правила, определенные для входной кодовой страницы, поэтому даже если вы воссоздаете номер кодовой точки, вы не получите фактический вставленный символ, вы получите любой символ, который отображает кодовая страница. к.

Причина, по которой все работает при использовании Read или ReadLine, заключается в том, что они основаны на потоках, а не на клавиатуре. Очевидно, что любой символ может войти через поток ввода, так как не происходит перевод клавиатуры и кодовой страницы. Но вы не можете получить доступ к потоку ввода напрямую, используя ReadKey, только клавиатуру (и если поток ввода перенаправлен не с клавиатуры, ReadKey потерпит неудачу сразу).

Может быть какой-то способ реплицировать функциональность «перехват» ReadKey, используя поток ввода, если вы вручную используете API консоли с P / Invoke, но это будет нетривиально, и консоль на самом деле не предназначена для этого такого рода вещи, так что вы, вероятно, будете бороться с этим весь путь.


Edit: все это говорит о том, что вы все равно можете реализовать свои собственные комбинации клавиш, чтобы позволить вводить символы Unicode с помощью клавиатуры - например, типа CTRL + ALT + U и затем четырех шестнадцатеричных цифр - ваша процедура ReadKey могла обнаружить CTRL + ALT + U, а затем захватить следующие четыре нажатия клавиш, сделать из них целое число и преобразовать его в символ - но, конечно, это не позволит вставить.

0 голосов
/ 04 августа 2011

Теперь это просто странно. IIRC мое тестирование проводилось на 32-битной, вероятно, Vista.

Теперь проверено то же самое на Win7 64-bit, чертовски работает!

Так что либо Vista, либо 32-битная ошибка.

Может кто-нибудь подтвердить это?

0 голосов
/ 28 ноября 2008

Объект ConsoleKeyInfo, возвращаемый Console.ReadKey (), имеет свойство KeyChar, содержащее символ Unicode для нажатой клавиши или комбинации клавиш (если клавиша или комбинация клавиш имеют Unicode-эквивалент) Итак ...

char c = Console.ReadKey().KeyChar;

Вы получите символ '\ 0', если у ключа нет эквивалента в Юникоде (например, функциональная клавиша).

Вы можете использовать StringBuilder для объединения этих символов вместе в строку Unicode, если это необходимо.

...