Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用Console.ReadKey读取Unicode_.net_Console.readkey - Fatal编程技术网

.net 使用Console.ReadKey读取Unicode

.net 使用Console.ReadKey读取Unicode,.net,console.readkey,.net,Console.readkey,是否可以向console应用程序提供Unicode输入,并通过console.ReadKey()读取Unicode字符/字符串 我知道Unicode在通过其他方法读取输入时起作用,但不幸的是,我需要使用ReadKey提供的“拦截”功能 更新: 将Unicode字符(如U+03BB(λ))粘贴到控制台时,将读取3个键 Alt+NumPad1 Alt+NumPad1 Alt+NumPad8 我试图查看这是否是某种编码,但看不到任何内容。Console.ReadKey()返回的ConsoleKeyIn

是否可以向console应用程序提供Unicode输入,并通过console.ReadKey()读取Unicode字符/字符串

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

更新:

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

  • Alt+NumPad1
  • Alt+NumPad1
  • Alt+NumPad8

  • 我试图查看这是否是某种编码,但看不到任何内容。

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

    如果该键没有Unicode等效项(例如,函数键),则会得到一个“\0”字符


    如果需要,您可以使用StringBuilder将这些字符连接到一个Unicode字符串中。

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

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

    当使用Read或ReadLine时,它都能工作的原因是它们是基于流的方法,而不是基于键盘的方法。显然,任何字符都可以通过输入流输入,因为没有键盘和代码页转换。但您无法使用ReadKey直接访问输入流,只能使用键盘(如果输入流已从键盘以外的位置重定向,ReadKey将彻底失败)

    如果您将控制台API与p/Invoke一起手动使用,可能有一些方法可以使用输入流复制ReadKey的“截取”功能,但这并不重要,而且控制台并不是真正设计用来做这类事情的,因此您可能会一路与之抗争



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

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

    现在在Win7 64位上进行了同样的测试,这个该死的东西可以工作了

    所以要么是Vista,要么是32位bug


    有人能确认一下吗?

    是的,你可能会这样想,但它不返回Unicode,只对ASCII有效。我只是偶然发现它实际上在Win7 64位上有效。奇怪。“原始密钥代码在控制台的输入代码页中映射到哪个Unicode字符”至少在Vista上看起来是错误的;相反,我直接在控制台的输入代码页中获取值(例如:在法语控制台上,键入
    é
    产生130(其IBM-850值),而不是233(U+00E9),并且它回显一个问号,而
    ReadLine()
    正确地回显
    é
    并产生233)。
    char c = Console.ReadKey().KeyChar;