如何从控制台输入字符串中获取控制字符

How to get control characters from a console input string

我已经查看了建议的 "already answered" 问题。大多数情况下,他们只想丢弃这样的 "non-printable" 输入。我要用。

我正在使用

从键盘输入返回一个 UTF8 String
BufferedReader br = new BufferedReader( new InputStreamReader(System.in, 'UTF-8' ));
String response = br.readLine();

并且我有兴趣确定用户是否将输入(例如,向上箭头或向下箭头)作为他们的击键之一。

遍历此 String 中的 chars 我发现向下箭头转换为(charint 值)27、91、66,即3 char 秒。第一个值对应于 Escape。因此,这似乎不是识别单个 Character 并确定它是否不可打印的问题。

我也不清楚为什么这个控制字符不能作为单个 UTF8 字符打印出来,而是作为 UTF8 字符的 3 个组成部分打印出来:这是否意味着当你遍历一个String 你实际上是逐字节获取它的内容?

我只是想知道在给定的 UTF8 字符串中是否有任何记录或巧妙的方法来执行此操作(查找和识别控制字符)。也许是 Apache Commons。或者也许在 Groovy(我实际上正在使用,而不是 Java)?

您可以使用 Character::isISOControl 方法 (javadoc) 测试真正的控制字符。

但是,如评论中所述,向上箭头和向下箭头是击键而不是字符。它们在输入流中实际产生的内容取决于平台。例如,如果您使用的是符合 ANSI 标准的终端或终端仿真器,则向上箭头将映射到序列 ESC [ A。如果你简单地过滤掉ISO控制字符,你将只删除ESC

我认为没有可靠的独立于平台的方法来过滤掉因用户错误键入箭头键而产生的垃圾。对于特定于平台的解决方案,您需要了解用户输入设备产生的特定序列。然后你检测并删除 sequences.