2011-12-02 65 views

回答

12

根据终端的ECMA-48标准,SGR(Select Graphic Rendition)代码9应该能够实现划叉文本。然而,维基百科页面说,它没有得到广泛的支持,我不知道有这样做。我怀疑那是因为DEC的VTxxx系列didn't support it

+0

我的'libvterm' /'pangoterm'可以做到这一点。请参阅[链接](http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html)中的第二个屏幕截图 – LeoNerd

+3

实际上,一组优秀的shell终端似乎支持它(这包括''guake'',''terminator'',''gnome-terminal'',...)。 http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility。快速测试:''echo -e“\ e [9mtest \ e [0m”''。 – vaab

4

用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; 
} 

代码前缀每个字符与行程覆盖\u0336输入text。请注意,该函数假定text采用单字节编码(如ASCII或拉丁文)进行编码。如果输入为UTF-8,则必须首先将其转换为UTF-32以获取字符边界。

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

与上面提到的ANSI转义序列相比,Unicode解决方案还会在我的终端(terminator)中生成稍微不同的锁定。前者使文本正好在文本的中间,而后者使文本略低于文本。

相关问题