수평선을 그리는 가장 간단한 프로그램:
int main()
{ initscr(); for (int i=0;i<10;i++) addch(ACS_HLINE); getch(); endwin(); }
로컬에서는 잘 작동하지만 MOSH를 통해 연결할 때의 결과는 qqqqqqqqqq입니다.
다른 유명한 ncurses 프로그램을 이런 식으로 테스트했는데(MOSH를 통해 연결됨) 그 중 일부는 잘 작동했습니다(예: alsamixer, vim, tmux...). 그러나 다른 테스트에서는 "못생긴 문자"도 표시되었습니다. 예: Tetris 게임(bastet), 대화 상자 (쉘 스크립트에서 대화 상자를 표시합니다).
따라서 내 프로그램인 Tetris, Dialog 및 기타 프로그램에 대한 위의 질문은 다음과 같습니다.
- 기본적으로 xterm 및 가상 터미널(term=linux) 및 tmux/screen에서 작동합니다.
- SSH를 통해서도 잘 작동합니다.
- MOSH 클라이언트에서 줄 대신 q 및 x 문자를 표시합니다.
Mosh는 노트북 Wi-Fi에서 SSH 연결 끊김 문제를 해결하는 데 매우 유용한 프로그램입니다. 자체 터미널을 생성하고 TERM 변수를 xterm으로 설정합니다. mosh를 통해 프로그램을 시작하기 전에 용어 변수는 "xterm"이었고 로케일 명령은 LANG=en_US.UTF8,LC_ALL=""로 표시되었으며 글꼴은 괜찮아 보였습니다(다른 글꼴을 테스트해도 동일한 결과가 나타남).
이 문제를 해결하거나 추가로 디버깅하는 방법을 아는 사람이 있습니까?
가장 간단한 시뮬레이션:
sudo apt-get install mosh bastet #<--install mosh and tetris
bastet #<--tetris works ok
mosh -- 127.0.0.1 bastet #<--q and x chars instead of lines
답변1
ncurses 매뉴얼 페이지에 있습니다: 환경NCURSES_NO_UTF8_ACS
단말기가 사용 중인 VT100 스타일 선 그리기 코드를 인식하지 못한다는 것을 알리도록 설정할 수 있습니다. 또한 U8
터미널 설명의 기능( TERM=tmux
예: use)도 동일한 내용을 알려줍니다.
최신 터미널 설명 보유mosh
ncurses 터미널 데이터베이스에서. 요약하자면, 선을 긋는 것 이상의 문제가 있습니다.
답변2
매우 잘 작동하는 alsamixer의 소스 코드를 분석한 후 다음 줄이 매우 중요하다는 것을 알았습니다.
setlocale(LC_ALL, "");
에서 언급했듯이c 라이브러리 문서. 이것이 없으면 'C' 로캘이 기본값입니다.
따라서 내 프로그램은 이제 MOSH보다 더 나은 성능을 발휘합니다.
{ setlocale(LC_ALL, ""); initscr(); ... draw lines ... getch(); endwin(); }
하지만 프로그램 외부에서 이 문제를 해결하는 다른 답변은 수락하겠습니다. 소스 코드를 변경하지 않고 테트리스가 이 작업을 수행하도록 강제하는 방법과 같습니다.