是否可以向控制台应用程序提供Unicode输入,并通过Console.ReadKey()读取Unicode字符串/字符串?
我知道Unicode在通过其他方法读取输入时起作用,但不幸的是我需要使用ReadKey提供的“拦截”功能。
更新
将U + 03BB(λ)等Unicode字符粘贴到控制台时,会读取3个键。
我试图看看这是否是某种编码,但看不到任何内容。
答案 0 :(得分:5)
不幸的是,Console.ReadKey只能处理键盘事件。键盘事件只能表示可以在键盘上键入的内容(使用ConsoleKey枚举中定义的实际和“虚拟”键)。因此,当使用ReadKey时,您将只获得两件事:原始键代码(对应于键盘上的键)和翻译字符(原始键代码映射到控制台输入代码页中的Unicode字符)(和每个代码页最多可以映射256个字符)。您无法使用ReadKey读取任何其他类型的数据(即无法直接键入和/或在输入代码页中没有映射的字符)。
此外,当您将Unicode字符粘贴到控制台时,ReadKey使用的API会尝试将字符转换为Windows ALT + nnn序列(即,按住ALT并在键盘上键入代码点编号)。不幸的是,它首先使用为输入代码页定义的规则来翻译字符,因此即使您重新构建代码点编号,您也无法获得粘贴的实际字符,您将获得代码页映射它的任何字符到。
使用Read或ReadLine时一切正常的原因是这些是基于流的方法,而不是基于键盘的方法。显然,任何字符都可以通过输入流进入,因为没有键盘和代码页翻译发生。但是你不能直接使用ReadKey来获取输入流,只能使用键盘(如果输入流已经从键盘以外的其他位置重定向,则ReadKey将彻底失败)。
如果您手动使用带P / Invoke的控制台API,可能有某种方法可以使用输入流复制ReadKey的“拦截”功能,但它不是很重要,并且控制台并不是真的设计用于执行此操作所以你可能会在整个方面与它作斗争。
编辑:所有这一切,您仍然可以实现自己的组合键,以允许通过键盘输入Unicode字符 - 例如键入CTRL + ALT + U,然后输入四个十六进制数字 - 您的ReadKey例程可以检测到CTRL + ALT + U然后抓住接下来的四个击键并从中取出一个int并将其转换为char - 但当然这不允许粘贴。
答案 1 :(得分:0)
Console.ReadKey()返回的ConsoleKeyInfo对象有一个名为KeyChar的属性,其中包含按下的键或键组合的Unicode字符(如果键或键组合具有Unicode等效项)。所以......
char c = Console.ReadKey().KeyChar;
如果密钥没有Unicode等价物(例如,功能键),您将获得'\ 0'字符。
如果需要,您可以使用StringBuilder将这些字符串联成一个Unicode字符串。
答案 2 :(得分:0)
现在这很奇怪。 IIRC我的测试是在32位,可能是Vista。
现在在Win7 64位上测试相同,血腥的东西有效!
无论是Vista还是32位错误。
有人可以确认吗?