Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从控制台输入字符串中获取控制字符_Java_Utf 8_Keyboard_Non Printing Characters - Fatal编程技术网

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

Java 如何从控制台输入字符串中获取控制字符,java,utf-8,keyboard,non-printing-characters,Java,Utf 8,Keyboard,Non Printing Characters,为此,我已仔细阅读了建议的“已回答”问题。大多数情况下,他们只是想放弃这种“不可打印”的输入。我想用它 我得到一个UTF8字符串,它是通过使用 BufferedReader br = new BufferedReader( new InputStreamReader(System.in, 'UTF-8' )); String response = br.readLine(); 我感兴趣的是识别用户是否有输入,例如,向上箭头或向下箭头作为他们的击键之一 在这个字符串中迭代chars,我发现向下箭

为此,我已仔细阅读了建议的“已回答”问题。大多数情况下,他们只是想放弃这种“不可打印”的输入。我想用它

我得到一个UTF8
字符串
,它是通过使用

BufferedReader br = new BufferedReader( new InputStreamReader(System.in, 'UTF-8' ));
String response = br.readLine();
我感兴趣的是识别用户是否有输入,例如,向上箭头或向下箭头作为他们的击键之一

在这个
字符串中迭代
char
s,我发现向下箭头转化为
char
的(
int
值)27、91、66,即3
char
s。第一个值对应于
转义
。因此,这似乎不是一个识别单个
字符
并确定其是否不可打印的问题

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


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

您可以使用
character::isISOControl
方法()测试实际的控制字符

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


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

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

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


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

向上箭头不是控制字符,而是这只是一个键盘键。按下它的效果取决于你正在使用的任何控制台,最常见的是没有任何效果。似乎你正在使用一个控制台进行测试,当你按下箭头时,该控制台将产生一系列以转义控制字符开头的字符。这种行为来自你的choi控制台ce和Java完全无关。我建议您尝试一下您的控制台的功能。好的,谢谢。我在Windows 10机器上使用Cygwin BASH控制台。我没有意识到这是特定于控制台的。鉴于Cygwin旨在模拟Linux,我想知道我是否能在Linux终端上获得相同的序列。目前我无法访问Linux操作系统,但会做一些实验。在我看来,你所观察到的与你在典型的linux控制台中获得的结果是一致的。我也没有现成的。这实际上取决于用户选择使用什么终端以及它支持什么行编辑功能。一般来说,他们应该能够输入任何按键当他们对屏幕显示下一行要输入的内容感到满意时,请按enter键。他们和终端之间存在错误。@谢谢。是的,这实际上是为了模拟您在*nix提示符下得到的一些内容:例如,向上箭头->键入上一个命令。事实上他是一个发明了一种“抓”的好方法的人按下Enter之前的每个字符,请参见此处:……不幸的是,尽管它适用于W10,可能适用于Linux,但它似乎不适用于Cygwin。向上箭头不是一个控制字符,它只是一个键盘键。按下它的效果将取决于您使用的任何控制台,最常见的是没有任何效果。I似乎您正在使用一个控制台进行测试,当您按下箭头时,该控制台将生成以转义控件字符开头的字符序列。此行为来自您选择的控制台,与Java完全无关。我建议您尝试一下控制台的功能。好的,谢谢。我正在Wind上使用Cygwin BASH控制台ows 10机器。我没有意识到这是特定于控制台的。鉴于Cygwin旨在模拟Linux,我想知道我是否能在Linux终端上获得相同的序列。目前我无法访问Linux操作系统,但会做一些实验。在我看来,你所观察到的与你在典型Linux控制台中获得的一致。我不知道也没有现成的。这实际上取决于用户选择使用什么终端以及它支持什么行编辑功能。一般来说,他们应该能够输入他们想要的任何击键,然后在满意屏幕显示下一行输入的内容时按enter键。错误为b在他们和他们的终端之间。@谢谢。是的,这实际上是为了模仿