Я уже изучал escape-коды ANSI, но похоже, что поддерживается только подчеркивание.
Я что-то пропустил или есть еще один вариант?
Если это невозможно, есть ли что-то эквивалентное в значении "это устарело"?
Я уже изучал escape-коды ANSI, но похоже, что поддерживается только подчеркивание.
Я что-то пропустил или есть еще один вариант?
Если это невозможно, есть ли что-то эквивалентное в значении "это устарело"?
Согласно стандарту ECMA-48 для терминалов, код SGR (Select Graphic Rendition), код 9, должен разрешить перечеркнутый текст. Тем не менее, код escape-кода ANSI на странице википедии говорит, что он не получил широкого распространения, и я не знаю об этом. Я подозреваю, что, поскольку DEC VTxxx series не поддерживал его.
Альтернативным решением для приложений, написанных на 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. Первый выводит строку точно в середине текста, тогда как последний делает ее немного ниже.