한글 글에만 한글 폰트를 싣는 법

log / / 3 sections

이 사이트는 라틴 본문에 IBM Plex Sans 를 직접 싣는다. 네 벌 합쳐 57KB. 운영체제가 뭘 갖고 있든 같은 화면이 나오는 값으로는 싸다.

한글은 사정이 다르다. 완성형 11,172자를 다 담으면 한 벌에 4MB 가 넘는다. 글 하나 읽자고 그걸 받게 할 수는 없다.

글 단위로 자른다

방법은 단순하다. 빌드가 끝난 뒤 각 글의 HTML 을 읽어서, 거기 실제로 등장한 한글 코드포인트만 모아 그 글 전용 서브셋을 만든다.

import re
chars = set(re.findall(r"[가-힣ㄱ-ㅎㅏ-ㅣ]", html))
subset(font, unicodes=chars, output=f"fonts/ko/{slug}.woff2")

이 글에 쓰인 글자는 몇백 자 남짓이다. 서브셋 결과는 원본의 1% 수준으로 줄어든다. 영어로 쓴 글에는 한글 폰트가 아예 실리지 않는다.

대가

글을 고치면 폰트를 다시 만들어야 한다. 빌드가 하는 일이니 손이 갈 일은 없지만, 빌드 없이 HTML 만 손으로 고치는 건 이제 안 된다.

그리고 서브셋은 그 글에만 유효하다. 여러 글을 이어 읽으면 글마다 새 폰트를 받는다. 글이 수십 편이 되면 자주 쓰이는 2,350자짜리 공통 서브셋을 먼저 받고 나머지만 글별로 채우는 쪽이 낫다. 지금은 글이 둘이라 그 최적화가 이르다.

서체 선택

IBM Plex Sans KR 을 쓴다. 라틴과 같은 가족이라 목소리가 갈라지지 않고, OFL 이라 직접 서빙해도 문제없다. 새 서체를 하나 더 섞는 것보다 이쪽이 낫다.

Comments