是否可以在具有删除效果的控制台中显示文本?

时间:2011-12-02 13:40:52

标签: text terminal console ansi-escape strikethrough

我已经查看了ANSI转义码,但看起来只支持下划线。

我是否遗漏了某些内容还是有其他选择?

如果不可能,那么“这是否已被弃用”的含义是否相同?

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:5)

使用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或Latin)编码。如果输入是UTF-8,则必须先将其转换为UTF-32以获得字符边界。

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

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

答案 2 :(得分:1)

这对我有用。

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