11

すでにANSIエスケープコードを調べましたが、下線のみがサポートされているようです。

私は何かを逃しますか、それとも別の選択肢がありますか?

それが不可能な場合、「これは非推奨です」という意味で同等のものはありますか?

4

3 に答える 3

14

端末のECMA-48標準によると、SGR(Select Graphic Rendition)コード番号9は、取り消し線付きのテキストを有効にすることになっています。ただし、ANSIエスケープコードのウィキペディアのページには、広くサポートされていないと記載されており、サポートされていることはわかりません。DECのVTxxxシリーズがそれをサポートしていなかったからだと思います。

于 2011-12-02T14:11:24.233 に答える
5

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̶hUTF-8対応の端末になります。最初の文字に取り消し線がない理由がわかりません。これは最終的な問題であるに違いありません。取り消し線関数を呼び出す前に少なくとも1文字を印刷することで、これを回避できます。

terminatorUnicodeソリューションは、上記のANSIエスケープシーケンスと比較して、端末()でわずかに異なるロックも生成します。前者はテキストの真ん中に行をレンダリングしますが、後者は少し下にラインをレンダリングします。

于 2015-10-15T17:04:33.057 に答える
1

これは私のために働きます。

$ echo -e`echo"これは取り消し線のテキストです"| sed's/.\{1\}/&\\\u0336/g'`

于 2021-03-09T18:21:50.317 に答える