Можно ли отображать текст в консоли с эффектом пробития?

Я уже изучал escape-коды ANSI, но похоже, что поддерживается только подчеркивание.

Я что-то пропустил или есть еще один вариант?

Если это невозможно, есть ли что-то эквивалентное в значении "это устарело"?

Ответ 1

Согласно стандарту ECMA-48 для терминалов, код SGR (Select Graphic Rendition), код 9, должен разрешить перечеркнутый текст. Тем не менее, код escape-кода ANSI на странице википедии говорит, что он не получил широкого распространения, и я не знаю об этом. Я подозреваю, что, поскольку DEC VTxxx series не поддерживал его.

Ответ 2

Альтернативным решением для приложений, написанных на C11 или С++ 11, является использование Unicode сочетание длинного штрихового оверлея.

В С++ 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. Я не знаю, почему первый персонаж не имеет пробития, это должна быть проблема с терминами. Я мог бы обойти это, напечатав хотя бы один символ перед вызовом функции strikethrough.

Решение Unicode также генерирует немного отличающуюся блокировку в моем терминале (terminator) по сравнению с вышеупомянутой escape-последовательностью ANSI. Первый выводит строку точно в середине текста, тогда как последний делает ее немного ниже.