ncurses 라이브러리에서 한글이 깨질 때

ncurses 라이브러리를 쓸 때, 로케일 설정을 올바로 했는데도 한글이 깨지는 문제가 있다.

#include <locale.h>
#include <curses.h>

int main() {
  setlocale(LC_CTYPE, "ko_KR.utf-8"); /* 로케일 설정을 했는데도 */
  initscr();
  printw("%s", "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
  printw("%s", "가나다라마바사아자차카타파하\n");
  refresh();
  sleep(1);
  endwin();
  return 0;
}

이 코드를 컴파일해 실행하면 한글이 깨져서 출력된다. ncurses 라이브러리가 유니코드를 지원하지 않기 떄문이다.

유니코드를 지원하는 버전

ncurses 라이브러리 배포판 중에 데비안 패키지인 libncurses5-dev는 유니코드를 지원하지 않는다. 한글을 제대로 출력하려면 유니코드를 지원하는 버전인 libncursesw5-dev를 사용해야 한다.

설치

데비안 기반 배포판인 경우 아래와 같이 설치한다.

$ sudo apt-get install libncursesw5-dev

헤더 인클루드

다른 라이브러리를 쓰는 것이므로 curses.h 대신 ncursesw/curses.h를 인클루드해야 한다. 위의 예제 코드를 예로 들면 두 번째 줄을 아래와 같이 고쳐야 한다.

#include <ncursesw/curses.h>

링크

-lncurses 대신 -lncursesw 옵션으로 링크하면 된다.

$gcc SOURCE.c -o APP -lncursesw

결과물을 실행해 보면 이제 ncurses에서 한글이 잘 출력된다는 것을 알 수 있다.