すでにANSIエスケープコードを調べましたが、下線のみがサポートされているようです。
私は何かを逃しますか、それとも別の選択肢がありますか?
それが不可能な場合、「これは非推奨です」という意味で同等のものはありますか?
すでにANSIエスケープコードを調べましたが、下線のみがサポートされているようです。
私は何かを逃しますか、それとも別の選択肢がありますか?
それが不可能な場合、「これは非推奨です」という意味で同等のものはありますか?
端末のECMA-48標準によると、SGR(Select Graphic Rendition)コード番号9は、取り消し線付きのテキストを有効にすることになっています。ただし、ANSIエスケープコードのウィキペディアのページには、広くサポートされていないと記載されており、サポートされていることはわかりません。DECのVTxxxシリーズがそれをサポートしていなかったからだと思います。
C11またはC++11で記述されたアプリケーションの代替ソリューションは、長いストロークのオーバーレイ文字を組み合わせたUnicodeを使用することです。
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に変換する必要があります。
その場合、出力はs̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h
UTF-8対応の端末になります。最初の文字に取り消し線がない理由がわかりません。これは最終的な問題であるに違いありません。取り消し線関数を呼び出す前に少なくとも1文字を印刷することで、これを回避できます。
terminator
Unicodeソリューションは、上記のANSIエスケープシーケンスと比較して、端末()でわずかに異なるロックも生成します。前者はテキストの真ん中に行をレンダリングしますが、後者は少し下にラインをレンダリングします。
これは私のために働きます。
$ echo -e`echo"これは取り消し線のテキストです"| sed's/.\{1\}/&\\\u0336/g'`