【问题标题】:Decoding ANSI escape sequences in Dart在 Dart 中解码 ANSI 转义序列
【发布时间】:2021-06-28 21:01:03
【问题描述】:

我正在为针对 linux_x64 的 Flutter Desktop 编写一些代码。
我正在从一些应用程序中提取一些日志,这些日志呈现如下语法:

  • 使用less logfile检查日志文件

    ESC(BESC[mauthentication-msESC(BESC[m
    
    
  • 使用less -r logfile 检查日志文件我可以在终端中看到彩色文本。

  • 使用cat logfile 检查日志文件我可以在终端中看到彩色文本。

  • 使用cat -vte logfile检查日志文件我明白了:

    ^[(B^[[mauthentication-ms^[(B^[[m$
    
  • 在 Flutter 中使用此代码

    Future<String> readAsString = file.readAsString();
    readAsString.then((String value) => _log = utf8.decode(value.runes.toList()));
    

    我在 SelectableText 小部件中获得此输出

    (B[mauthentication-ms(B[m
    

我真的对这种行为感到困惑,所以如果有人对此有经验,欢迎提出建议!

有两种选择:

  • 清理所有日志,可视化普通文本
  • 尝试像 less -r 那样解码文本,将彩色文本可视化到 Flutter 应用程序中。

编辑: 我解决了导入tint plugin:tint: ^2.0.0

并更改 Dart 代码(使用 tint 插件中的 strip() 方法)如下:

Future<String> readAsString = file.readAsString();
readAsString.then((String value) => _log = value.strip());

【问题讨论】:

  • 我找不到更能说明问题的标题,如果您可以随意更改!
  • lesscat 不解码文本,你的终端是。您需要做的是创建一个函数来遍历字符串并删除\x1b 字符和字母之间的每个字符。

标签: linux flutter dart flutter-desktop


【解决方案1】:

那些有趣的字符被称为转义序列,程序使用它们来打印颜色和斜体等等。

终端旨在解码这些转义序列,但常规程序不知道如何处理它们。 lesscat 正在打印文件中的内容,是您运行它们的终端对它们进行解码。

您必须让您的程序通过并使用如下代码删除所有转义序列:

m = "h\x1b[34mello\x1b(A.\x1b[H" # Text full of random escape sequences
c = 0 # A count variable
p = True # Are we not in an escape sequence?
o = "" # The output variable
for l in m:
    if l == "\x1b":
        p = False
    elif p:
        o += l
    elif l in "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm": # Most (maybe all) escape sequences end in letters.
        p = True
    c += 1 # Move on to the next letter in the input string
    
print(o) # Text without escape sequences

【讨论】:

  • 等等,我刚刚意识到你没有使用 Python。无论如何,代码应该做那种事情。
  • 别担心语言,我会尝试在 Dart 中做同样的事情。无论如何,谢谢你,对我来说不是更合适。感谢您的时间和解释。我会向您介绍我将使用的代码。
  • 如果你想集成飞镖代码来解决这个问题,请查看编辑!再次感谢你:)
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 2015-07-08
  • 2012-04-18
  • 2012-04-14
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多