11

我已经研究过 ANSI 转义码,但看起来只支持下划线。

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

如果不可能,在“不推荐使用”的含义中是否有等效的东西?

4

3 回答 3

14

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

于 2011-12-02T14:11:24.233 回答
5

用 C11 或 C++11 编写的应用程序的替代解决方案是使用 Unicode组合长笔划覆盖字符。

在 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 才能获得字符边界。

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

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

于 2015-10-15T17:04:33.057 回答
1

这对我有用。

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

于 2021-03-09T18:21:50.317 回答