Alternatywnym rozwiązaniem dla aplikacji napisanych w C11 lub C++ 11 jest użycie znaku Unicode combining long stroke overlay.
w C++ 11 można napisać kod coś takiego:
#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;
}
Kod prefiksów każdy znak na wejściu text
z udarem nakładki \u0336
. Zauważ, że funkcja zakłada, że kod text
jest kodowany w kodowaniu jednobajtowym, takim jak ASCII lub łaciński. Jeśli wejście jest w UTF-8, najpierw musi zostać przekonwertowane na UTF-32, aby uzyskać granice znaków.
Dane wyjściowe to s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h
w terminalu obsługującym UTF-8. Nie wiem, dlaczego pierwsza postać nie ma żadnego przejścia, musi być kwestią terminala. Mógłbym obejść to, drukując przynajmniej jeden znak przed wywołaniem funkcji przekreślenia.
Rozwiązanie Unicode generuje również nieco inne blokowanie w moim terminalu (terminator
) w porównaniu do sekwencji eskportowej ANSI wspomnianej powyżej. Ta pierwsza powoduje, że linia jest dokładnie w środku tekstu, podczas gdy druga sprawia, że jest nieco poniżej.
Moje 'libvterm' /' pangoterm' może zrobić to dobrze. Zobacz drugi zrzut ekranu w [link] (http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html) – LeoNerd
Właściwie dobry zestaw głównego terminala powłoki wydaje się go wspierać (obejmuje to '' guake'', '' terminator'', '' gnome-terminal'', ...). http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility. Szybki test: "echo -e" \ e [9mtest \ e [0m "'. – vaab