【问题标题】:Is it possible to display text in a console with a strike-through effect?是否可以在带有删除线效果的控制台中显示文本?
【发布时间】:2012-01-11 12:49:03
【问题描述】:

我已经研究过 ANSI 转义码,但似乎只支持下划线。

我错过了什么还是有其他选择?

如果不可能,是否有与“已弃用”的意思等效的东西?

【问题讨论】:

    标签: text terminal console ansi-escape strikethrough


    【解决方案1】:

    根据终端的ECMA-48 标准,SGR(选择图形再现)代码号 9 应该启用划掉的文本。但是,ANSI escape code 维基百科页面说它没有得到广泛支持,我不知道有任何支持。我怀疑那是因为 DEC 的 VTxxx 系列didn't support it

    【讨论】:

    • 我的libvterm/pangoterm 可以做到这一点。见link中的第二张截图
    • 实际上有一套不错的主要shell终端似乎支持它(这包括guaketerminatorgnome-terminal,...)。 misc.flogisoft.com/bash/… 。快速测试:echo -e "\e[9mtest\e[0m".
    • Kitty 支持 SGR 代码 9 用于划线文本(以及许多其他未充分使用的模式)。大多数常见的 linux 终端都使用 libvterm,所以至少在 Linux 上,这种模式得到了广泛的支持。但是,Putty 不支持它。
    • 我发现在 Windows 上,Windows Terminal 支持,VS Code 的终端模拟器也支持。 Powershell 和 CMD 不能在没有终端模拟器的情况下进行转义码,所以看起来很兼容
    【解决方案2】:

    用 C11 或 C++11 编写的应用程序的另一种解决方案是使用 Unicode combining long stroke overlay 字符。

    在 C++11 中,您可以编写如下代码:

    #include <iostream>
    #include <string>
    
    std::string strikethrough(const std::string& text) {
      std::string result;
      for (auto ch : text) {
        result.append(u8"\u0336");
        result.push_back(ch);
      }
      return result;
    }
    
    int main() {
      std::cout << strikethrough("strikethrough") << std::endl;
    }
    

    代码在输入text 中的每个字符前加上笔划覆盖\u0336。请注意,该函数假定 text 以单字节编码(如 ASCII 或拉丁文)进行编码。如果输入为 UTF-8,则必须先将其转换为 UTF-32 才能获得字符边界。

    然后在支持 UTF-8 的终端中输出为 s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h。我不知道为什么第一个字符没有删除线,一定是终端问题。我可以通过在删除线函数调用之前打印至少一个字符来解决此问题。

    与上面提到的 ANSI 转义序列相比,Unicode 解决方案还在我的终端 (terminator) 中生成了稍微不同的锁定。前者将行准确地呈现在文本的中间,而后者将其呈现在下方。

    【讨论】:

    • 如果在每个字符之后而不是之前添加\u0336,它有时会产生“拉直”字符的效果,并且还应该贯穿每个字符。
    【解决方案3】:

    这对我有用。

    $ echo -e `echo "这是一个删除线文本" | sed 's/.\{1\}/&\\\u0336/g'`

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多