linux - 在 Dart 中解码 ANSI 转义序列

标签 linux flutter dart flutter-desktop

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

  • 使用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
    

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

有 2 个选项:

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

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

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

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

最佳答案

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

终端被设计来解码这些转义序列,但常规程序不知道如何处理它们。 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

关于linux - 在 Dart 中解码 ANSI 转义序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66911697/

相关文章:

linux - 如何制作符号链接(symbolic link)但 cd 应显示物理目录名称

android - 当从图像选择器打开相机时,应用程序 "Lost connection to device."

flutter - Streambuilder中的GestureRecognizer不会更新snapshot.data

flutter - Dart:使用 map 过滤列表

linux - 将 QEMU 窗口输出重定向到运行 qemu 的终端

c++ - 在 Mac OS X 上使用 Eclipse CDT 调试远程 Linux 应用程序

linux - 从 apache 访问日志测量流量

android - Flutter 工作管理器返回 "Worker result FAILURE for Work [ id=XXXXXxXXXXxXXXX tags={ be.tramckrijte.workmanager.BackgroundWorker } ]"

Flutter 使用本地 sqlite 文件创建 ListView

firebase - 在空上调用了 'toLowerCase'方法。