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

问题描述 投票:0回答:5

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

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

如果不可能,是否有等同于“已弃用”的意思?

text terminal console ansi-escape strikethrough
5个回答
15
投票

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


6
投票

用 C11 或 C++11 编写的应用程序的替代解决方案是使用 Unicode combining long stroke overlay character.

在 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
) 中生成了一个稍微不同的锁定。前者将线条恰好呈现在文本的中间,而后者将其呈现在下方。


4
投票

这对我有用。

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


0
投票

找不到比这更简单的事情了:

$ echo -e "\e[9myour text goes here\e"

0
投票

使用 SGR 模式 9

短篇

功能 顺序
开始删除文本
Esc
[
9
m
停止删除文本
Esc
[
0
m

这使用 ECMA-48 Select Graphic Rendition 序列,它适用于大多数现代终端程序,但可能无法使用较旧的终端软件。

0
参数是可选的,可以省略以选择模式 0(普通文本)。

用法示例

printf "\e[9m"
printf "Casey"
printf "\e[m"

© www.soinside.com 2019 - 2024. All rights reserved.