How to get control characters from a console input string
我已经查看了建议的"已经回答"的问题。大多数情况下,他们只想放弃这种"不可打印"的输入。我想用它。
我正在使用键盘输入返回UTF8 String
并且我有兴趣确定用户是否输入了例如向上箭头或向下箭头作为其击键之一。
迭代通过String中的char,我发现向下箭头转换为(int char的值)27,91,66,即3 char s。第一个值对应于Escape。因此,似乎这不是识别单个Character并发现它是否是不可打印的问题。
另外我不清楚为什么这个控制字符不能作为单个UTF8字符打印出来,而是打印出来作为UTF8字符的3个组成部分:这是否意味着当你遍历String时你是实际上逐字节获取其内容?
我只是想知道在给定的UTF8字符串中是否有任何记录或巧妙的方法(查找和识别控制字符)。也许Apache Commons。或者也许在Groovy中(我实际上使用的是Java而不是Java)?
-
向上箭头不是控制字符,它只是一个键盘键。按下它的效果将取决于你碰巧使用的控制台,最常见的是没有任何效果。您似乎正在使用控制台进行测试,当您按箭头时,该控制台将生成以转义控制字符开头的字符序列。此行为来自您选择的控制台,与Java完全无关。我建议你试验你的控制台做什么。
-
好,谢谢。我在Windows 10机器上使用Cygwin BASH控制台。我没有意识到这是特定于控制台的。鉴于Cygwin旨在模拟Linux,我想知道我是否会在Linux终端上获得相同的序列。目前我无法访问Linux操作系统,但会进行一些实验。
-
在我看来,您所观察到的内容与您在典型的Linux控制台中获得的内容一致。我也没准备好。
-
这取决于用户选择使用哪种终端以及它支持的线路编辑功能。通常,他们应该能够输入他们想要的任何击键,然后当他们确信屏幕正在显示他们要输入的内容作为下一行时按Enter键。他们和他们的终端之间存在错误。
-
@TomB谢谢。是的,这实际上是为了模拟你通过* nix提示获得的一些东西:例如向上箭头 - >键入上一个命令。实际上有一个人在按下Enter之前开发了一个"抓住"每个角色的好方法,请看这里:stackoverflow.com/a/30008252/595305 ...不幸的是,虽然它适用于W10并且可能与Linux一起使用,但它并没有似乎与Cygwin合作。
您可以使用Character::isISOControl方法(javadoc)测试实际控制字符。
但是,如评论中所述,向上箭头和向下箭头是击键而不是字符。 它们在输入流中实际产生的是平台相关的。 例如,如果您使用符合ANSI标准的终端或终端仿真器,则向上箭头将映射到序列ESC [ A。 如果只是过滤掉ISO控制字符,则只删除ESC。
我不认为有一种可靠的平台独立方式来过滤掉用户错误地键入箭头键导致的垃圾。 对于特定于平台的解决方案,您需要了解用户输入设备生成的特定序列。 然后检测并删除序列。
-
谢谢。我不认为程序可以某种方式询问终端以找出它是什么类型的平台?符合ANSI标准或其他什么?
-
可能有启发式方式。 AFAIK,没有标准方式。
-
我想uname可能有帮助,这可以帮助你区分Linux,Mac和Cygwin(stackoverflow.com/questions/3466166/…)...奇怪的是,在W10 DOS控制台中输入uname会给出"Cygwin"我的机器。嗯。
-
实际上,它没有多大帮助。识别本地操作系统并不能告诉您连接到RS232线路的终端或通过(例如)SSH连接在远程计算机上运行的终端仿真器的特性。实际上,即使是本地"终端仿真器"应用程序也可以选择在不同样式的终端仿真之间切换,为箭头键发出不同的序列。
-
得到它了。噢亲爱的。那好吧。在某种程度上是奇怪的:即你的程序根本无法找到键盘到字节/字符序列的映射如何发生给定的I / O通道。我有一个程序,它使用颜色突出显示单词...它在* nix中工作,但在W10 DOS中,你得到奇怪的输入,如"{escape} [032m"(应该是"切换到绿色文本")。
-
要使Windows控制台处理类似VT100的序列(如典型的Linux控制台),您需要设置ENABLE_VIRTUAL_TERMINAL_PROCESSING控制台模式标志;请参阅docs.microsoft.com/en-us/windows/console/getconsolemode