Чтение Unicode с помощью Console.ReadKey

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

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

Обновлять:

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 336
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

char c = Console.ReadKey().KeyChar;

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

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

Да, этого можно было ожидать, но он не возвращает Unicode, работает только для ASCII.

leppie 29.11.2008 16:54

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

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

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

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


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

Просто случайно узнал, что он на самом деле работает на 64-битной Win7. Странный.

leppie 04.08.2011 15:55
"который является символом Unicode, которому необработанный код клавиши сопоставляется на входной кодовой странице консоли" кажется ложным, по крайней мере, в Vista; Вместо этого я получаю непосредственно значение в входной кодовой страницы консоли (пример: на французской консоли ввод é дает 130 (его значение IBM-850) вместо 233 (U + 00E9), и это перекликается со знаком вопроса - тогда как ReadLine() правильно перекликается с é и дает 233).
Medinoc 08.06.2014 12:01
Ответ принят как подходящий

Это просто странно. IIRC Я тестировал 32-битную версию, вероятно, Vista.

Сейчас протестировал то же самое на 64-битной Win7, чертовски работает!

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

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

Другие вопросы по теме