Проблема не в том, что Консоль не знает, как обращаться с Юникодом (она делает, и правильно, проверьте эту ветку ).Проблема заключается в том, что вы понимаете нажатие клавиш на клавиатуре, перевод кодов клавиш, перевод кодов клавиш в символы и то, как работает метод ReadKey ().
Прежде всего: если вы хотитечитать последовательные символы, вместо этого использовать Console.ReadLine()
, он выполняет всю математику за вас, и лучше.
Давайте рассмотрим следующую программу:
Console.WriteLine("Press a key to start (Enter to stop).");
var key = Console.ReadKey();
var allKeys = "";
while(key.Key != ConsoleKey.Enter)
{
Console.WriteLine(key.KeyChar);
allKeys += key.KeyChar;
key = Console.ReadKey();
}
Она читаетключ от ввода, чем он добавляет его к строке.Не о чем беспокоиться, верно?Неправильно!На международной клавиатуре США вы можете сделать следующее:
- Тип `+ a становится
à
- Тип Alt + 123 становится
{
- Тип Alt +3355 становится ←
- Тип;как будто на испанской клавиатуре становится -
В зависимости от вашей клавиатуры, вы нажимаете другую клавишу для определенного символа.Иногда вы будете нажимать комбинацию клавиш.Первая комбинация, указанная выше, записывается как \0a
в виде строки и кода ключа 0
(не в перечислении), а затем ConsoleKey.A
.Итоговая строка теперь равна "\0á{←ñ"
.
. Alt + 123/3355 записывается как код клавиши 18 (это клавиша Alt).Преобразование числовых клавиш в символ выполняется ОС до его отправки на консоль.
Ввод ;
на клавиатуре США или ñ
на испанской клавиатуре покажет ConsoleKey.Oem1
(США) и ConsoleKey.Oem3
(испанский).
Хотя я не могу имитировать ваше поведение, возможно, это из-за того, что у меня нет вашего экрана, но очень похоже, что шрифт, который вы используете в качестве шрифта консоли, не поддерживает символы, отличные от Юникода.В Windows 7, по умолчанию, я не знаю, для других версий Windows.Также возможно, что кодовая страница вашей консоли установлена неправильно.
Для суммирования
То, что составляет символ, зависит от раскладки клавиатуры, выбранной клавиатуры в международных настройках, выбранного языка,выбранная кодовая страница в консоли и разрешены ли комбинации клавиш (это ухудшается с IME!).Переход от KeyChar к обычному символу часто тривиален, но зависит от того, синхронизированы ли ваши системные настройки друг с другом.
Когда я запускаю ваши примеры в своей системе, у меня не такое поведение.Но опять же, у меня нет вашей системы.
Переход от ключа к персонажу - дело сложное.Я предлагаю вам не полагаться на свою способность заново изобретать то, что уже есть в системе.Это хорошая практика, чтобы попытаться увидеть, что происходит, но на самом деле вернуться к ReadLine
;).
РЕДАКТИРОВАТЬ:
Я только что видел ваше последнее изменение.Обратите внимание, что у вас могут быть разные кодировки для ввода и вывода (Console.InputEncoding
и Console.OutputEncoding
).Я также хотел бы процитировать другой поток, чтобы подчеркнуть, что при переключении на Unicode кодовая страница больше не имеет значения.Это поведение по умолчанию в последних версиях Windows:
Если вы выберете шрифт Unicode, такой как Lucida Console или Consolas, вы сможете видеть и вводить символы Unicode на консоли независимо от того,что говорит ЧКП: