유니코드의 각 문자가 콘솔 화면에서 차지하는 크기를 알 수 있을까?

1. 발단

Notepad2가 4.2.25로 업데이트되면서 새롭게 추가된 기능중 하나가 좌우정렬 기능이다.
텍스트로만 구성된 문서 내에서 나름의 정렬 기능을 구현하는 것이다.

한글이 들어가면 정렬이 잘 되지 않음


그런데, 이 기능은 약간의 문제가 있다. (유니코드를 기준으로) 모든 글자의 폭을 동일하게 가정하는 것이다.
기능 자체가 고정폭 글꼴 환경에서 정렬기능을 구현한 것인데, CJK 문자들이 들어가면 답이 안 나오는 것이다.


2. 원시적 접근법

간단히 보기엔 CJK(한글/한자/카나)는 영문의 2배의 폭을 갖는다는 단순한 논리로 시작하면 된다.
유니코드 테이블에서 한글/한자/카나의 영역은 정의되어 있으니 그 영역의 문자는 2배 폭을 갖도록 하면 되는 것이다.

그런데, 문제가 있다. 이 테이블에는 전각문자에 대한 정의가 되어있지 않는다는 것이다.

예를 들면,는 분명히 전각문자인데, 는 글꼴에 따라 가끔 전각이 아닌 경우를 볼 수 있다.
유니코드 테이블에서 쉽게 정의할 수 있을 것 같지만, 콘솔 화면에서의 폭은 정의되어 있지 않기 때문이다.


3. 또 다른 접근법

각 글자에 적용된 글꼴에 대해 각 글자의 폭을 계산해서 처리하는 방법이 있다.
즉, 각 글자의 폭을 계산해서 이를 기반으로 공백을 추가하는 것이다.

이 방법은 완전해보이지만, 치명적인 문제가 있다.
폰트에 정의되지 않은 글자는 폭을 알 수 없고, 이에 따라 정상적으로 정렬할 수가 없다는 것이다.


4. 고민과 토의

이 문제에 대해 Notepad2의 개발자인 Florian Balmer 씨와 수차례 얘기를 나눴다.
여러가지 시도에 대해 고민을 하고, 토의를 했다.
하지만, 결론은 어떠한 방법이든 quick and dirty한 방법일 뿐, 명확하면서도 안정적인 방법은 될 수 없다는 것이었다.

유니코드 시대가 시작되면서 이 문제는 더이상 아시아권에서만 고민되는 문제가 아니다.
이 문제에 대해 MSDN 블로그에서도 얘기가 좀 있었다.
하지만, 결론은 "답이 없다"는 것이었다.


5. 내가 선택한 결론

MSDN 블로그의 답글 중 하나에 나름의 솔루션이 제안되었다.
이 솔루션은 사실상 2번의 솔루션과 같으며, 가장 간편하고 깔끔하다.

일단 유니코드로 변환한 뒤 if() 문만 잘 쓰면 되니까...

아래와 같은 비교 테이블을 만들어 이와 비교해서 폭을 계산하기로 했다.

1100-11FF 한글
2121-2122 전각문자
2153-2155 전각문자
2329-232A 전각문자
2460-254B 전각문자
2700-27BE 전각문자
2E80-A4CF 전각문자, 카나, 한글자모, 한자, 부호 / 303F 제외
A700-A7F5 한자
AC00-D7A3 한글
F900-FAFF 한자
FE10-FE19 세로쓰기 문자
FE30-FE6F 전각문자
FF00-FF60 전각문자
FFE0-FFE6 전각문자