2008-11-28 3 views
2

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

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

Update:

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

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

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

ответ

0

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

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

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

Возможно, кто-то подтвердит это?

0

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

char c = Console.ReadKey().KeyChar; 

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

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

+1

Да, вы ожидали бы этого, но он не возвращает Unicode, работает только для ASCII. – leppie 2008-11-29 13:54:09

5

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

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

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

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


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

+0

Спасибо за объяснение :) – leppie 2008-12-01 17:37:23

Смежные вопросы