能否向控制台应用程序提供Unicode输入,并通过Console.ReadKey()读取Unicode字符/字符串?
我知道Unicode在通过其他方法读取输入时工作,但不幸的是,我需要使用ReadKey提供的“拦截”功能。
更新:
当将Unicode字符(如U+03BB (λ) )粘贴到控制台时,将读取3个键。
我试过看这是不是某种编码,但什么也看不见。
发布于 2011-08-04 11:53:41
现在这太奇怪了。我的测试是32位的,可能是Vista。
现在在Win7 64位上进行了同样的测试,这个该死的东西起作用了!
所以要么是Vista,要么是32位错误。
有人能确认一下吗?
发布于 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,然后抓取接下来的四个击键,然后将其转换为字符--但这当然不允许粘贴。
发布于 2008-11-28 17:14:03
由ConsoleKeyInfo ()返回的Console.ReadKey对象具有一个名为KeyChar的属性,该属性包含按下的键或键组合的Unicode字符(如果密钥或密钥组合具有等效的Unicode )。所以..。
char c = Console.ReadKey().KeyChar;如果密钥没有等效的Unicode (例如,函数键),您将得到一个'\0‘字符。
如果有必要,可以使用StringBuilder将这些字符连接到Unicode字符串中。
https://stackoverflow.com/questions/325516
复制相似问题