본문 바로가기

파일 형식 백과사전

내려받은 폰트가 한글을 지원하는지, 설치하기 전에 코드로 확인하는 법

해외 폰트 사이트에서 마음에 드는 서체를 내려받았는데,

정작 적용해 보면 한글 부분만 시스템 기본 폰트로 뭉개져 나오는 경우가 있습니다.

미리보기 이미지는 영어로만 되어 있어서, 한글을 지원하는지 설치하기 전에는 알기가 애매합니다.

 

사실 폰트 파일 안에는 "이 폰트가 어떤 글자를 담고 있는지"를 정리한 목록이 그대로 들어 있습니다.

그 목록을 직접 읽어서, 실제로 설치된 폰트들이 한글을 얼마나 담고 있는지 확인해 봤습니다.

 

폰트 5종의 한글 음절 11,172자 cmap 커버리지 실측. 맑은 고딕과 Pretendard Bold는 100%, Arial과 Consolas, Noto Sans(latin subset)는 0%

cmap이라는 이름의 색인표

폰트 파일에는 cmap이라는 테이블이 있습니다. "유니코드로 이 번호의 글자가 오면, 몇 번 글리프(글자 그림)를 보여줘라"는 대응표입니다. 이 표에 없는 글자는 애초에 그릴 그림이 없다는 뜻이라, 화면에서는 다른 폰트가 대신 그려 주거나 빈 네모(□)로 표시됩니다.

한글 음절은 유니코드에서 가(AC00)부터 힣(D7A3)까지 11,172개 자리를 차지합니다. 이 11,172개가 cmap에 몇 개나 들어 있는지 세어 보면 "한글을 지원하는 폰트인지"가 숫자로 나옵니다.


실제로 세어 보니

fontTools 4.63.0으로 다섯 폰트의 cmap을 읽어 11,172개 음절 중 몇 개가 포함되는지 확인했습니다.

폰트 한글 음절 커버리지 영문 A-Za-z
맑은 고딕 11,172 / 11,172 (100%) 52 / 52
Pretendard Bold 11,172 / 11,172 (100%) 52 / 52
Arial 0 / 11,172 (0%) 52 / 52
Consolas 0 / 11,172 (0%) 52 / 52
Noto Sans(라틴 서브셋판) 0 / 11,172 (0%) 52 / 52

다섯 폰트 모두 영문은 전부 들어 있지만, 한글은 0%이거나 100%로 딱 갈립니다. 절반만 지원하는 어중간한 경우는 이번 표본에서는 없었는데, 이는 한글을 다루는 폰트라면 완성형 음절 전체를 통째로 포함시키는 게 일반적인 제작 관행이기 때문입니다.

참고로 자음/모음 낱자도 별도로 존재합니다

완성된 음절 말고, ㄱㄴㄷ이나 ㅏㅑㅓ 같은 낱자 기호(호환 자모 영역)도 유니코드에 따로 자리가 있습니다. 맑은 고딕에서는 96개 중 94개가 채워져 있었습니다. 음절은 지원해도 낱자 몇 개가 빠진 폰트도 있을 수 있으니, 자음과 모음을 따로 입력하는 프로그램을 쓴다면 이 부분도 함께 확인해 볼 만합니다.

그런데 옛한글은 이야기가 다릅니다

현대 한글 음절과는 별개로, 유니코드에는 조선왕조실록이나 옛 문헌에 쓰인 자모까지 표현하는 옛한글 자모 영역(U+1100~11FF, 256칸)이 따로 있습니다. 같은 다섯 폰트로 이 영역도 확인해 봤습니다.

폰트 현대 한글 음절 옛한글 자모(U+1100~11FF)
맑은 고딕 100% 256 / 256 (100%)
Pretendard Bold 100% 0 / 256 (0%)

현대 한글은 둘 다 완벽하게 지원하는데, 옛한글로 가면 갈립니다.

맑은 고딕은 윈도우 시스템 폰트답게 옛 문헌 인용이나 학술 자료까지 염두에 두고 만들어져 이 영역까지 채워져 있지만, 웹과 UI 위주로 만들어진 Pretendard에는 이 영역이 아예 없습니다. 일반적인 한글 문서라면 문제없지만, 옛 문헌이나 방언 연구처럼 옛한글 자모가 필요한 문서라면 흔히 쓰는 웹폰트만으로는 부족할 수 있습니다.


지금 가진 폰트로 확인하는 법

내려받은 폰트 파일 경로만 바꾸면 바로 실행됩니다.

pip install fonttools

from fontTools.ttLib import TTFont

f = TTFont("확인할폰트.ttf")
cmap = f.getBestCmap()

hangul = set(range(0xAC00, 0xD7A4))
covered = hangul & set(cmap.keys())
print(f"한글 지원: {len(covered)}/11172 ({len(covered)/11172:.1%})")

결과가 0에 가까우면 그 폰트로는 한글이 아예 안 나온다고 보시면 됩니다.

반대로 100%에 가까우면 한글 음절 표시에는 문제가 없다는 뜻입니다. 폰트 파일 하나에 여러 서체가 묶인 ttc라면, 서체별로 cmap이 다를 수 있어 원하는 서체 번호를 지정해서 각각 확인해야 합니다. ttc 안에 서체가 몇 개나 들었는지는 예전에 다룬 글에서 실제로 열어 본 적이 있습니다.

 

자주 묻는 질문

Q. 한글이 0%인 폰트를 한글 문서에 쓰면 어떻게 되나요?
그 폰트가 지정된 텍스트 상자 안에서, 한글 부분만 시스템이 알아서 다른 대체 폰트로 바꿔 보여줍니다. 완전히 깨지기보다는 어색하게 섞여 보이는 쪽에 가깝습니다.

 

Q. 커버리지가 100%면 디자인 품질도 좋다는 뜻인가요?
아닙니다. cmap은 "그 글자가 있느냐 없느냐"만 알려줄 뿐, 글자 모양의 완성도나 가독성과는 별개입니다.

 

Q. 한자도 같은 방식으로 확인할 수 있나요?
됩니다. 유니코드 한자 영역(예: 기본 한자는 4E00부터 9FFF) 범위로 바꿔 같은 코드를 돌리면 됩니다.

 

Q. 옛한글이 없는 폰트로 옛한글 문서를 열면 어떻게 되나요?
현대 한글과 같은 원리로, 그 부분만 다른 폰트로 대체되어 표시됩니다. 전체가 안 열리는 건 아니지만, 문서 전체의 서체 통일감은 깨집니다.

 

 

미리보기 이미지만으로는 알 수 없는 부분을, 코드 몇 줄로 설치 전에 미리 확인할 수 있습니다. 마음에 드는 해외 폰트를 발견했다면 다운로드 전에 이 방법으로 한글 지원 여부부터 짚어 보시길 권합니다. 한글이 지원되는 걸 확인했다면, 그 폰트를 문서에 끼워 넣어 배포해도 되는지는 fsType 값을 따로 확인해 볼 차례입니다.

 

위 커버리지 수치는 실제 폰트 파일을 fontTools로 열어 cmap 테이블을 직접 센 값입니다.

 

 

 

용량 제한에 걸린 큰 파일, 조각으로 나눠 보내고 받은 쪽에서 합치는 법

큰 영상을 보내려다 용량 제한에 막히면 대개 분할 압축을 떠올리게 됩니다.그런데 막상 하려고 보면 궁금한 게 생깁니다. 나눠서 보내면 총 용량도 줄어드는 걸까요.조각을 하나 잃어버리면 나

richyeon.com

 

 

행은 3천 개뿐인데 엑셀 파일이 3.4MB, 용량을 먹는 범인을 파일 안에서 찾아내기

엑셀 파일이 무거워지면 대개 데이터가 많아서라고 생각하게 됩니다. 하지만 실제로는 데이터 양과 파일 용량이 따로 노는 경우가 훨씬 흔합니다.3,000행짜리 주문 내역을 실제로 만들어 저장해

richyeon.com

 

 

움짤(GIF) 용량이 유독 커요, 프레임과 색상 수로 줄이는 법

사진 몇 장을 이어 붙여 움짤을 만들었는데, 정지 사진 하나보다 용량이 몇 배나 커진 경험 있으신가요. 카카오톡으로 보내려니 전송이 느리고, 커뮤니티에 올리려니 용량 제한에 걸리기도 합니

richyeon.com