【问题标题】:Why are ANSI escape codes not displaying properly?为什么 ANSI 转义码无法正确显示?
【发布时间】:2020-11-11 17:40:16
【问题描述】:

我正在实现一个 Python 控制台应用程序,它使用 ANSI 转义码为各种事物着色。我在 Pop OS(一个 Ubuntu 衍生产品)上进行开发,并且着色按设计工作。

我刚刚在 Centos 机器上试用了该应用程序,虽然颜色正确显示,但彩色文本周围还有其他文本(包含数字的小框,垂直堆叠),显然对应于转义码。

转义码都在这一段 Python 中指定:

style = ('\033[1m\033[3m' if bold and italic else
         '\033[1m' if bold else
         '\033[3m' if italic else
         '\033[0m')
return f'\001{style}\002\001\033[38;5;{color.code}m\002{s}\001\033[0m\002'

(我正在做的项目是https://github.com/geophile/marcel,以上代码来自marcel.util.colorize()。)

真正奇怪的是,在某些情况下,多余的字符不存在,而在其他情况下却存在。另外,如果我从我的 pop os 机器 ssh 到我的 centos 机器,文本在所有情况下都会正确着色。

是什么解释了这种行为差异——.bashrc 中的某些东西?关于 X 配置?

【问题讨论】:

    标签: console-application ansi-escape


    【解决方案1】:

    \002 不是“ANSI”转义码。一些程序(不是终端)可能会解释它,并且根据字符串的使用方式,可能会绕过打算处理的程序额外的逃脱。 (某些终端 当然可能会为 002 等提供自己的解释,但除了它们的源代码之外,您不太可能在任何地方找到文档)。

    【讨论】:

    • 我重新阅读了我在进行着色时找到的信息,发现 \001 和 \002 确实不是 ANSI 转义码。这些由 readline 解释。我发现如果没有这些代码,readline 计算的行长是不正确的。所以现在我的着色代码在准备提示以供 readline 使用时包括 \001 和 \002 ,否则将它们排除在外。
    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多