为此,我仔细研究了建议的“已回答”问题。通常,他们只是希望丢弃此类“不可打印的”输入。我要使用它。
我正在使用
从键盘输入返回UTF8BufferedReader br = new BufferedReader( new InputStreamReader(System.in, 'UTF-8' ));
String response = br.readLine();
char
我想确定用户是否输入了例如向上箭头或向下箭头作为其击键之一。
在此String
的{{1}}中进行迭代,我发现向下箭头转换为(int
的{char
值)27、91、66,即3 { {1}}个。第一个值对应于char
。因此,似乎这并不是识别单个Escape
并确定其是否不可打印的问题。
我也不清楚为什么不能将此控制字符作为单个UTF8字符打印出来,而是作为UTF8字符的3个组成部分打印出来:这是否意味着当您迭代{{ 1}}实际上是逐字节获取其内容吗?
我只是想知道在给定的UTF8字符串中是否有任何记录或巧妙的方法(查找和识别控制字符)。也许是Apache Commons。还是在Groovy中(我实际上正在使用而不是Java)?
答案 0 :(得分:2)
您可以使用Character::isISOControl
方法(javadoc)测试实际的控制字符。
但是,如注释中所述,向上箭头和向下箭头是按键而不是字符。它们在输入流中实际产生的内容取决于平台。例如,如果您使用的是符合ANSI的终端或终端仿真器,则向上箭头将映射到序列ESC [ A
。如果仅过滤掉ISO控制字符,则将仅删除ESC
。
我认为,没有一种可靠的平台独立方法可以过滤掉由于用户错误键入箭头键而导致的垃圾。对于特定于平台的解决方案,您需要了解用户的输入设备产生了哪些特定序列。然后,您检测并删除序列。