Una solución alternativa para las aplicaciones escritas en C11 o C++ 11 es utilizar el carácter Unicode combining long stroke overlay.
En C++ 11 se puede escribir código o menos así:
#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;
}
El código prefijos cada carácter en la entrada text
con la superposición de carrera \u0336
. Tenga en cuenta que la función supone que text
está codificado en una codificación de un solo byte, como ASCII o latín. Si la entrada está en UTF-8, primero debe convertirse a UTF-32 para obtener los límites del carácter.
La salida es s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h
en un terminal compatible con UTF-8. No sé por qué el primer personaje no tiene un ataque, debe ser un problema terminal. Podría solucionar esto imprimiendo al menos un caracter antes de la llamada a la función tachado.
La solución Unicode también genera un bloqueo ligeramente diferente en mi terminal (terminator
) en comparación con la secuencia de escape ANSI mencionada anteriormente. El primero representa la línea exactamente en el medio del texto, mientras que el segundo lo representa un poco más abajo.
Mi 'libvterm' /' pangoterm' puede hacerlo bien. Vea la segunda captura de pantalla en [link] (http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html) – LeoNerd
En realidad, un buen conjunto de la terminal shell principal parece ser compatible (esto incluye '' guake'', '' terminator'', '' gnome-terminal'', ...). http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility. Prueba rápida: '' echo -e "\ e [9mtest \ e [0m" ''. – vaab