如何过滤来自 InputStream 的 ANSI/终端控制序列?

问题描述 投票:0回答:1

我正在使用 pty4j 库构建一个简单的终端仿真器。我的程序有一个

print()
方法,该方法使用 javafx 中的
GraphicsContext.fillText()
方法将文本呈现到画布上。我将模拟器连接到 cmd 的一个实例,并从缓冲读取器读取输出。现在可悲的是,当它收到文本时,它还包含 ANSI 转义字符(见图)。但是,如果我将输出打印到 IDE 或系统控制台,它工作正常。

我尝试使用 BufferedReader 中的

readLine()
方法,然后应用正则表达式,但因为并非所有从终端收到的输入都以
\n
终止,它会在最后一行阻塞。

Thread terminalReaderThread = new Thread() {
   public void run() {
      try {
         int c;
         while (terminal.isRunning() && (c = terminal.getReader().read()) != -1) {
            if(c != 0){
               print(Character.toString((char)c));
            }
         }

      } catch (IOException e) {
         e.printStackTrace();
      }
  }
};
terminalReaderThread.start();

有没有有效的方法从inputStream中过滤掉这些转义码?

java inputstream xterm ansi-escape terminal-emulator
1个回答
1
投票

我收到的问题答案(安全忽略未知的 ANSI、ESC/P、ESC/POS 序列,知道长度)也应该回答你的问题。 如果您阅读标准(ECMA-48 https://www.ecma-international.org/wp-content/uploads/ECMA-48_5th_edition_june_1991.pdf),您会看到序列总是从转义字符开始并总是结束具有定义范围内的值的 FINAL BYTE。 有了这些信息就足以检测每个序列的开始和结束。 (例如正则表达式)(换行符(和其他 C0 代码)也不允许在转义序列内使用,因此您永远不会有一个不完全位于一行内的转义序列)

© www.soinside.com 2019 - 2024. All rights reserved.