0

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

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

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

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

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

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

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

4

1 回答 1

2

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

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

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

于 2019-03-21T12:56:45.747 回答