Можно ли отображать текст в консоли с эффектом зачеркивания? - PullRequest
10 голосов
/ 02 декабря 2011

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

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

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

Ответы [ 2 ]

13 голосов
/ 02 декабря 2011

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

5 голосов
/ 15 октября 2015

Альтернативное решение для приложений, написанных на 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 или Latin. Если входные данные находятся в UTF-8, они должны быть сначала преобразованы в UTF-32, чтобы получить границы символов.

В этом случае вывод будет s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h в терминале с поддержкой UTF-8. Я не знаю, почему у первого персонажа нет зачеркнутого, должно быть, это конечная проблема. Я мог бы обойти это, напечатав хотя бы один символ перед зачеркнутым вызовом функции.

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

...