在 Dart 中解码 ANSI 转义序列
Decoding ANSI escape sequences in Dart
我正在为 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: tint: ^2.0.0
并更改 Dart 代码(使用 tint 插件中的 strip()
方法)如下:
Future<String> readAsString = file.readAsString();
readAsString.then((String value) => _log = value.strip());
那些有趣的字符称为转义序列,程序使用它们来打印颜色和斜体等等。
终端设计用于解码这些转义序列,但常规程序不知道如何处理它们。 less
和 cat
正在准确打印文件中的内容,这是您 运行 对它们进行解码的终端。
你必须让你的程序通过一段代码,并删除所有的转义序列,如下所示:
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
我正在为 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: tint: ^2.0.0
并更改 Dart 代码(使用 tint 插件中的 strip()
方法)如下:
Future<String> readAsString = file.readAsString();
readAsString.then((String value) => _log = value.strip());
那些有趣的字符称为转义序列,程序使用它们来打印颜色和斜体等等。
终端设计用于解码这些转义序列,但常规程序不知道如何处理它们。 less
和 cat
正在准确打印文件中的内容,这是您 运行 对它们进行解码的终端。
你必须让你的程序通过一段代码,并删除所有的转义序列,如下所示:
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