当前位置:  开发笔记 > 开发工具 > 正文

使用Console.ReadKey读取Unicode

如何解决《使用Console.ReadKey读取Unicode》经验,为你挑选了1个好方法。

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

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

更新:

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

    Alt + NumPad1

    Alt + NumPad1

    Alt + NumPad8

我试图看看这是否是某种编码,但看不到任何东西.



1> Eric Rosenbe..:

不幸的是,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 - 但当然这不允许粘贴.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有