컴퓨터공부/Embedded

[펌] embedded qt에서 한글 출력

achivenKakao 2005. 12. 4. 03:15
1. qt는 BDF,TTF 폰트를 지원합니다.

2. qpf 폰트는 qt가 이들 bdf, ttf 폰트를 로드해서 rendering 이라는 절차를 거치는 과정에서 qpf라는 폰트를 나름대로 만들어서 사용을 하는 폰트입니다. qt쪽에서 보다 더 빠르게 만들어 놓은 format입니다.

3. 프로그램 실행 옵션 중에 -savefonts 가 있습니다. 이 옵션을 주게 되면 내부적으로 사용하는 qpf를 디스크에 save를 해줍니다.

4. fontdir 파일의 사용방법
우선 $QTDIR/src/kernel/qfontmanager_qws.cpp 파일을 보면 자세히 나와있습니다.
<name> <file> <renderer> <italic> <weight> <size> <flags> 

name - 프로그램에서 사용하는 setFont() 함수의 첫번째 인자에 해당합니다.
file - file이름
renderer - BDF or TTF
italic - 이텔릭체를 표현하겠냐? y or n
weight - 글씨의 굵기
size - 글씨의 크기
flags - 3가지 값을 가질 수 있습니다.
s - smooth anti-alias를 지원하는 폰트에 해당
u - font 체계가 unicode형식을 지원할 때
a - ascii 코드

주의할 것은 flags 중 u, a 값은 -savefonts 를 할 때 중요한 영향을 끼칩니다. 즉 사용하는 폰트가 unicode 형식을 지원한다고 해도 fontdir 에 u flag 를 써주지 않으면 savefonts 할 때 기본적으로 ascii 영역의 코드 밖에 저장되지 않습니다.

5. ttf의 한글폰트를 qpf로 바꾸는 방법

5.1 사용자가 임의로 추가한 폰트가 userfont.ttf 라고 할 때, 이 파일을 /usr/qte/etc/fonts 디렉토리에 넣습니다.
5.2 fontdir 파일을 수정합니다. 다음 줄을 추가합니다.
userfont userfont.ttf TTFM
5.3 응용프로그램에서 setFont를 해주는 부분에서 userfont 를 사용할 수 있게 수정을 합니다.
setFont("userfont",140,50)
5.4 응용프로그램을 컴파일 합니다.
5.5 응용프로그램을 컴파일 할 때, -savefonts 옵션을 줍니다.
5.6 그럼 /usr/qte/etc/fonts 에 userfont_140_50.qpf 가 생깁니다.

6. 응용프로그램 수정 없이 ttf폰트를 사용하기
원래 /usr/qte/etc/fonts/fontdir 의 내용
helvetica helvetica_80_50.qpf QPF n 80 50
helvetica helvetica_100_50.qpf QPF n 100 50
helvetica helvetica_120_50.qpf QPF n 120 50

위처럼 되어 있는 파일을 다음과 같이 고칩니다.(단 한 줄만 있는 겁니다.)
helvetica userfont.ttf TTF
그리고 응용프로그램 실행시킬때 -savefonts옵션을 줘서 실행을 시킵니다.
./aclock -qws -savefonts
한 참 후에 응용프로그램이 뜰 것입니다. 기다려야 합니다. (폰트를 디스크에 쓰느라고 오래 걸립니다.)
응용프로그램이 보이면 /usr/qte/etc/fonts/ 디렉토리에 userfont_???_???.qpf 가 생긴 것을 볼 수 있습니다.

다음부터 이 qpf를 이용하게 하려면 fontdir을 고칩니다.
helvetica userfont_???_##.qpf QPF n ??? ##
??? 와 ##은 숫자입니다.
다음부터 응용프로그램은 qpf를 사용하므로 실행속도가 빨라집니다

fontdir 에 u 옵션을 주고 savefonts 로 qpf를 만드셨을 때 u 옵션을 안 줄때의 경우와 파일 용량이 큰 차이(훨씬 크다)가 있다면 폰트(한글폰트)는 제대로 만들어진 것입니다.

TTF 폰트도 각 폰트 문자셋을 unicode base로 만들었는지 KSC5601 base로 만들었는지에 따라서 출력이 안될 수도 있습니다.

batang.ttf gulim.ttf 는 unicode base로 만들어져 있습니다.

예를 들면, 한글 '가'는 unicode 일 경우 0xac00, KSC5601일 경우는 0xb0a1 입니다.

분명 응용프로그램을 작성할 때 vi를 이용했을 것입니다. 만약 이렇게 vi에서 한글은 KSC5601입니다. 따라서 이를 unicode 값으로 바꿔줘야 합니다. 이때 이용하는 것은 codec이 있습니다.
#include
QEucKrCodec* codec = new QEucKrCodec();
char* string="한글입니다";
QString hangul = codec->toUnicode(string, strlen(string));
이렇게 유니코드로 바꿔줍니다. hangul을 리스트 박스에 넣어보면 한글이 보일 것입니다