首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Console.ReadKey读取Unicode

用Console.ReadKey读取Unicode
EN

Stack Overflow用户
提问于 2008-11-28 11:14:01
回答 3查看 1.5K关注 0票数 2

能否向控制台应用程序提供Unicode输入,并通过Console.ReadKey()读取Unicode字符/字符串?

我知道Unicode在通过其他方法读取输入时工作,但不幸的是,我需要使用ReadKey提供的“拦截”功能。

更新:

当将Unicode字符(如U+03BB (λ) )粘贴到控制台时,将读取3个键。

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

我试过看这是不是某种编码,但什么也看不见。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-04 11:53:41

现在这太奇怪了。我的测试是32位的,可能是Vista。

现在在Win7 64位上进行了同样的测试,这个该死的东西起作用了!

所以要么是Vista,要么是32位错误。

有人能确认一下吗?

票数 0
EN

Stack Overflow用户

发布于 2008-11-30 17:56:32

不幸的是,Console.ReadKey只能处理键盘事件。键盘事件只能表示可以在键盘上键入的内容(使用在ConsoleKey枚举中定义的真实和“虚拟”键)。因此,在使用ReadKey时,只会得到两种情况:原始键代码(对应于键盘上的一个键)和转换字符,即原始键代码映射到控制台输入代码页中的Unicode字符(每个代码页最多可以映射256个字符)。您不能用ReadKey读取任何其他类型的数据(即不能直接键入和/或在输入代码页中没有映射的字符)。

此外,当您将Unicode字符粘贴到控制台时,ReadKey使用的API试图将该字符转换为ALT+nnn序列(即按住ALT并在键盘上键入代码点号)。不幸的是,它首先翻译字符,使用为输入代码页定义的规则,因此即使您重新构造代码点号,也不会得到粘贴的实际字符,您将得到代码页映射到的任何字符。

使用Read或ReadLine时,所有这些方法都能工作,原因是这些方法是基于流的,而不是基于键盘的方法。显然,任何字符都可以通过输入流输入,因为没有键盘和代码页转换发生。但是您不能使用ReadKey直接获取输入流,只能使用键盘(如果输入流被从键盘以外的其他地方重定向,ReadKey将彻底失败)。

如果您手动使用带有P/Invoke的console API,那么可能有一些方法可以使用输入流复制ReadKey的“拦截”功能,但这并不简单,而且控制台并不是真正用于完成这类任务的,因此您可能会在整个过程中都在与它作斗争。

编辑:尽管如此,您仍然可以实现自己的键组合,允许通过键盘输入Unicode字符--比如输入CTRL+ALT+U,然后输入四个十六进制数字--您的ReadKey例程可以检测到CTRL+ALT+U,然后抓取接下来的四个击键,然后将其转换为字符--但这当然不允许粘贴。

票数 5
EN

Stack Overflow用户

发布于 2008-11-28 17:14:03

由ConsoleKeyInfo ()返回的Console.ReadKey对象具有一个名为KeyChar的属性,该属性包含按下的键或键组合的Unicode字符(如果密钥或密钥组合具有等效的Unicode )。所以..。

代码语言:javascript
复制
char c = Console.ReadKey().KeyChar;

如果密钥没有等效的Unicode (例如,函数键),您将得到一个'\0‘字符。

如果有必要,可以使用StringBuilder将这些字符连接到Unicode字符串中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/325516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档