- 유니코드의 각 문자가 콘솔 화면에서 차지하는 크기를 알 수 있을까?
- 컴퓨터야그/notepad2
- 2011. 4. 8. 22:54
1. 발단
2. 원시적 접근법
3. 또 다른 접근법
4. 고민과 토의
5. 내가 선택한 결론
Notepad2가 4.2.25로 업데이트되면서 새롭게 추가된 기능중 하나가 좌우정렬 기능이다.
텍스트로만 구성된 문서 내에서 나름의 정렬 기능을 구현하는 것이다.
그런데, 이 기능은 약간의 문제가 있다. (유니코드를 기준으로) 모든 글자의 폭을 동일하게 가정하는 것이다.
기능 자체가 고정폭 글꼴 환경에서 정렬기능을 구현한 것인데, CJK 문자들이 들어가면 답이 안 나오는 것이다.
텍스트로만 구성된 문서 내에서 나름의 정렬 기능을 구현하는 것이다.
한글이 들어가면 정렬이 잘 되지 않음
그런데, 이 기능은 약간의 문제가 있다. (유니코드를 기준으로) 모든 글자의 폭을 동일하게 가정하는 것이다.
기능 자체가 고정폭 글꼴 환경에서 정렬기능을 구현한 것인데, CJK 문자들이 들어가면 답이 안 나오는 것이다.
2. 원시적 접근법
간단히 보기엔 CJK(한글/한자/카나)는 영문의 2배의 폭을 갖는다는 단순한 논리로 시작하면 된다.
유니코드 테이블에서 한글/한자/카나의 영역은 정의되어 있으니 그 영역의 문자는 2배 폭을 갖도록 하면 되는 것이다.
그런데, 문제가 있다. 이 테이블에는 전각문자에 대한 정의가 되어있지 않는다는 것이다.
예를 들면,♥는 분명히 전각문자인데, ▲는 글꼴에 따라 가끔 전각이 아닌 경우를 볼 수 있다.
유니코드 테이블에서 쉽게 정의할 수 있을 것 같지만, 콘솔 화면에서의 폭은 정의되어 있지 않기 때문이다.
유니코드 테이블에서 한글/한자/카나의 영역은 정의되어 있으니 그 영역의 문자는 2배 폭을 갖도록 하면 되는 것이다.
그런데, 문제가 있다. 이 테이블에는 전각문자에 대한 정의가 되어있지 않는다는 것이다.
예를 들면,♥는 분명히 전각문자인데, ▲는 글꼴에 따라 가끔 전각이 아닌 경우를 볼 수 있다.
유니코드 테이블에서 쉽게 정의할 수 있을 것 같지만, 콘솔 화면에서의 폭은 정의되어 있지 않기 때문이다.
3. 또 다른 접근법
각 글자에 적용된 글꼴에 대해 각 글자의 폭을 계산해서 처리하는 방법이 있다.
즉, 각 글자의 폭을 계산해서 이를 기반으로 공백을 추가하는 것이다.
이 방법은 완전해보이지만, 치명적인 문제가 있다.
폰트에 정의되지 않은 글자는 폭을 알 수 없고, 이에 따라 정상적으로 정렬할 수가 없다는 것이다.
즉, 각 글자의 폭을 계산해서 이를 기반으로 공백을 추가하는 것이다.
이 방법은 완전해보이지만, 치명적인 문제가 있다.
폰트에 정의되지 않은 글자는 폭을 알 수 없고, 이에 따라 정상적으로 정렬할 수가 없다는 것이다.
4. 고민과 토의
이 문제에 대해 Notepad2의 개발자인 Florian Balmer 씨와 수차례 얘기를 나눴다.
여러가지 시도에 대해 고민을 하고, 토의를 했다.
하지만, 결론은 어떠한 방법이든 quick and dirty한 방법일 뿐, 명확하면서도 안정적인 방법은 될 수 없다는 것이었다.
유니코드 시대가 시작되면서 이 문제는 더이상 아시아권에서만 고민되는 문제가 아니다.
이 문제에 대해 MSDN 블로그에서도 얘기가 좀 있었다.
하지만, 결론은 "답이 없다"는 것이었다.
여러가지 시도에 대해 고민을 하고, 토의를 했다.
하지만, 결론은 어떠한 방법이든 quick and dirty한 방법일 뿐, 명확하면서도 안정적인 방법은 될 수 없다는 것이었다.
유니코드 시대가 시작되면서 이 문제는 더이상 아시아권에서만 고민되는 문제가 아니다.
이 문제에 대해 MSDN 블로그에서도 얘기가 좀 있었다.
하지만, 결론은 "답이 없다"는 것이었다.
5. 내가 선택한 결론
MSDN 블로그의 답글 중 하나에 나름의 솔루션이 제안되었다.
이 솔루션은 사실상 2번의 솔루션과 같으며, 가장 간편하고 깔끔하다.
일단 유니코드로 변환한 뒤 if() 문만 잘 쓰면 되니까...
아래와 같은 비교 테이블을 만들어 이와 비교해서 폭을 계산하기로 했다.
이 솔루션은 사실상 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 전각문자
'컴퓨터야그 > notepad2' 카테고리의 다른 글
Notepad2 4.2.25 패치 준비#4: Mark Occurrences 기능 추가 (0) | 2011.05.08 |
---|---|
Notepad2 4.2.25 패치 준비#3: CJK 문자의 좌우 정렬 문제 해결 (0) | 2011.04.09 |
Scintilla 2.25의 LexCPP를 쓰려면 약간 수정을… (1) | 2011.03.24 |
Notepad2 4.2.25-rc6 패치 모음 (0) | 2011.03.20 |
Notepad2 4.2.25를 컴파일하기 전 준비사항 (0) | 2011.03.13 |
Recent comment