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

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终端似乎支持它(这包括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'`

【讨论】:

以上是关于是否可以在带有删除线效果的控制台中显示文本?的主要内容,如果未能解决你的问题,请参考以下文章

Android 设置密码文本是否暂时显示字符

Android 设置密码文本是否暂时显示字符

wxPython RichTextCtrl 带删除线

视图控制器上的表视图控制器

如何按下 tableview 单元格以在导航控制器中显示带有文本的视图控制器

带有 IPHONE 的亚马逊 sns 是不是可以离线使用..如果没有,有啥方法可以实现吗?