【发布时间】:2012-01-11 12:49:03
【问题描述】:
我已经研究过 ANSI 转义码,但似乎只支持下划线。
我错过了什么还是有其他选择?
如果不可能,是否有与“已弃用”的意思等效的东西?
【问题讨论】:
标签: text terminal console ansi-escape strikethrough
我已经研究过 ANSI 转义码,但似乎只支持下划线。
我错过了什么还是有其他选择?
如果不可能,是否有与“已弃用”的意思等效的东西?
【问题讨论】:
标签: text terminal console ansi-escape strikethrough
根据终端的ECMA-48 标准,SGR(选择图形再现)代码号 9 应该启用划掉的文本。但是,ANSI escape code 维基百科页面说它没有得到广泛支持,我不知道有任何支持。我怀疑那是因为 DEC 的 VTxxx 系列didn't support it。
【讨论】:
libvterm/pangoterm 可以做到这一点。见link中的第二张截图
guake,terminator,gnome-terminal,...)。 misc.flogisoft.com/bash/… 。快速测试:echo -e "\e[9mtest\e[0m".
用 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,它有时会产生“拉直”字符的效果,并且还应该贯穿每个字符。
这对我有用。
$ echo -e `echo "这是一个删除线文本" | sed 's/.\{1\}/&\\\u0336/g'`
【讨论】: