Est-il possible d'afficher du texte dans une console avec une grève par effet?
-
27-10-2019 - |
Question
Je l'ai déjà examiné les codes d'échappement ANSI, mais il semble que seulement soulignement est pris en charge.
Dois-je manqué quelque chose ou est-il une autre option?
S'il est impossible, est-il quelque chose d'équivalent au sens de «c'est dépréciée »?
La solution
Selon le ECMA-48 norme pour les terminaux, SGR numéro de code (Select Graphic Rendition) 9 est censé permettre le texte barré. Cependant, le ANSI page wikipedia de code d'échappement dit que ce n'est pas largement pris en charge, et je ne suis pas au courant de tout ce faire. Je soupçonne que ce parce que les séries VTxxx de DEC ne le supporte pas .
Autres conseils
Une solution alternative pour des applications écrites en C11 ou C ++ 11 consiste à utiliser le format Unicode combinant longtemps course superposition caractère.
En C ++ 11 vous pouvez écrire quelque chose comme code ceci:
#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;
}
Le code préfixes chaque caractère dans la text
d'entrée avec la superposition de la course \u0336
. On notera que la fonction suppose que text
est codé dans un singlebyte codant tel que ASCII ou Latin. Si l'entrée est en UTF-8, il doit être converti en UTF-32 d'abord pour obtenir les limites de caractères.
La sortie est alors s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h
dans un terminal capable UTF-8. Je ne sais pas pourquoi le premier caractère n'a pas biffé, doit être un problème terminal. Je pouvais contourner en imprimant au moins un caractère avant l'appel de fonction biffés.
La solution Unicode génère également un verrouillage légèrement différent dans mon terminal (terminator
) par rapport à la séquence d'échappement ANSI mentionné ci-dessus. L'ancien rend la ligne exactement au milieu du texte alors que celui-ci, il rend un peu en dessous.