2011-12-02 3 views

답변

12

단말기에 대한 표준 인 ECMA-48에 따르면 SGR (Select Graphic Rendition) 코드 번호 9는 교차 된 텍스트를 사용하도록되어 있습니다. 그러나 ANSI escape code 위키피디아 페이지에는 널리 지원되지 않는다고되어 있습니다. 나는 그것이 DEC의 VTxxx 시리즈 didn't support it이기 때문이라고 생각한다.

+0

내'libvterm' /'pangoterm'은 잘 할 수 있습니다. 실제로 두 번째 스크린 샷을 참조하십시오. (http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html) – LeoNerd

+3

실제로 주요 쉘 터미널 세트가이를 지원하는 것 같습니다. ''게놈'',''터미네이터'',''그놈 터미널'', ...). http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility. 빠른 테스트 :''echo -e "\ e [9mtest \ e [0m"''. – vaab

4

C11 또는 C++ 11로 작성된 응용 프로그램의 대체 솔루션은 유니 코드 combining long stroke overlay 문자를 사용하는 것입니다.

#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; 
} 

코드는 스트로크 오버레이 \u0336에 입력 text에서 각 문자를 접두사 :

는 C++ 11에서는이 같은 코드 뭔가를 작성할 수 있습니다. 이 함수는 text이 ASCII 또는 라틴과 같은 단일 바이트 인코딩으로 인코딩되어 있다고 가정합니다. 입력이 UTF-8 인 경우 문자 경계를 가져 오려면 먼저 UTF-32로 변환해야합니다.

출력은 UTF-8 가능 단말기에서 s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h입니다. 왜 첫 번째 캐릭터에 스트라이크 스루가 없는지 모르겠다. 터미널 문제 여야한다. 취소 선 함수 호출 전에 적어도 하나의 문자를 인쇄하여이 문제를 해결할 수 있습니다.

유니 코드 솔루션은 위에서 언급 한 ANSI 이스케이프 시퀀스와 비교하여 터미널에서 조금 다른 잠금을 생성합니다 (terminator). 전자는 텍스트의 중간에 라인을 정확하게 렌더링하지만, 후자는 텍스트를 중간에 렌더링합니다.

관련 문제