关于java:如何从控制台输入字符串中获取控制字符

How to get control characters from a console input string

我已经查看了建议的"已经回答"的问题。大多数情况下,他们只想放弃这种"不可打印"的输入。我想用它。

我正在使用键盘输入返回UTF8 String

1
2
BufferedReader br = new BufferedReader( new InputStreamReader(System.in, 'UTF-8' ));
String response = br.readLine();

并且我有兴趣确定用户是否输入了例如向上箭头或向下箭头作为其击键之一。

迭代通过String中的char,我发现向下箭头转换为(int char的值)27,91,66,即3 char s。第一个值对应于Escape。因此,似乎这不是识别单个Character并发现它是否是不可打印的问题。

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

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


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

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

我不认为有一种可靠的平台独立方式来过滤掉用户错误地键入箭头键导致的垃圾。 对于特定于平台的解决方案,您需要了解用户输入设备生成的特定序列。 然后检测并删除序列。