是否可以在带有删除线效果的控制台中显示文本?
Posted
技术标签:
【中文标题】是否可以在带有删除线效果的控制台中显示文本?【英文标题】:Is it possible to display text in a console with a strike-through effect? 【发布时间】:2012-01-11 12:49:03 【问题描述】:我已经研究过 ANSI 转义码,但似乎只支持下划线。
我错过了什么还是有其他选择?
如果不可能,是否有与“已弃用”的意思等效的东西?
【问题讨论】:
【参考方案1】:根据终端的ECMA-48 标准,SGR(选择图形再现)代码号 9 应该启用划掉的文本。但是,ANSI escape code ***页面说它没有得到广泛支持,我不知道有任何支持。我怀疑那是因为 DEC 的 VTxxx 系列didn't support it。
【讨论】:
我的libvterm
/pangoterm
可以做到这一点。见link中的第二张截图
实际上有一套不错的主要shell终端似乎支持它(这包括guake
,terminator
,gnome-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'`
【讨论】:
以上是关于是否可以在带有删除线效果的控制台中显示文本?的主要内容,如果未能解决你的问题,请参考以下文章