폰트 형식 변환 — 브라우저에서 WOFF2→TTF, TTF→WOFF/WOFF2
TTF·WOFF·WOFF2를 페이지 안에서 서로 변환합니다. 입력 형식은 파일 시그니처에서 자동으로 판별되고, 글리프 커버리지와 TrueType 힌팅은 그대로 유지되며 폰트는 업로드되지 않습니다(WOFF2 코덱은 로컬 WebAssembly 빌드). 20 MB CJK 폰트도 변환되지만 수십 초가 걸리고 한 번에 한 파일만 처리합니다.
이 폰트 변환기가 바꾸는 것과 바꾸지 않는 것
세 가지 형식 입력, 세 가지 형식 출력
.ttf·.woff·.woff2 파일을 고르고 대상으로 TTF·WOFF·WOFF2를 선택해 다운로드합니다. 입력 형식은 파일 시그니처(wOFF, wOF2, true/OTTO/0x00010000)로 자동 판별되므로 직접 지정할 필요가 없고, 원본과 같은 형식을 고르면 원래 바이트가 그대로 반환됩니다.
WOFF2와 TTF 양방향 변환을 로컬에서
WOFF2 인코딩·디코딩은 WebAssembly로 컴파일된 Google WOFF2 코덱이 페이지 안에서 실행하고, 구형 WOFF 컨테이너는 순수 JavaScript의 pako가 처리합니다. 서버와 주고받는 데이터가 없습니다.
글리프 커버리지와 힌팅 유지
윤곽을 다시 그리는 대신 폰트 테이블을 재패키징만 하므로 글리프 수와 cmap 커버리지가 완전히 동일하고, TrueType 힌팅(cvt·prep·fpgm 및 glyf 명령)도 그대로 남습니다. WOFF2 인코딩에서 빠지는 것은 DSIG 디지털 서명 테이블 하나뿐입니다.
웹폰트 호환성 작업을 위해
최신 브라우저에는 WOFF2를, 오래된 스택에는 WOFF나 TTF를 배포하거나 섞인 폰트 폴더를 한 형식으로 정리할 수 있습니다. 목적이 파일 크기 축소라면 폰트 서브셋 도구를 쓰세요. 이 페이지는 글리프를 삭제하지 않습니다.
한계도 명시
한 번에 한 파일만(선택한 첫 파일만 읽음), 굵기·기울임 조절 없음, TTC 컬렉션은 시그니처를 인식하지 못해 오류가 납니다. 20 MB CJK 폰트는 변환되지만 수십 초와 수백 MB 메모리를 사용합니다.
폰트 형식 변환 FAQ
지원하는 입력·출력 형식은 무엇인가요?
입력은 TTF(TrueType sfnt)·WOFF·WOFF2 세 확장자이며 파일 선택기도 이 셋만 받습니다. 입력 형식은 자동 판별됩니다. 출력은 드롭다운에서 TTF·WOFF·WOFF2를 고릅니다. TTC/OTC 컬렉션은 'Unrecognized font signature: ttcf'로 실패하고, OTF는 선택기에 없지만 파서 자체는 OTTO/CFF 폰트를 인식할 수 있습니다.
굵기를 조절하거나 기울임체로 만들 수 있나요?
안 됩니다. 변환은 기존 윤곽과 테이블을 재패키징할 뿐 굵은체·기울임·새 굵기를 합성하지 않습니다. 그 작업에는 폰트 설계 도구나 가변 폰트 축이 필요하며 이 페이지에는 그런 제어가 없습니다.
문자 커버리지나 힌팅이 손실되나요?
커버리지와 TrueType 힌팅은 유지됩니다. 모든 테이블이 복사되어 글리프 수가 동일하고(실측: 20.9 MB 송체가 변환 후에도 60455 글리프), cvt·prep·fpgm과 glyf 명령도 남습니다. WOFF2 인코딩에서 빠지는 것은 DSIG 서명 테이블뿐이며 WOFF 출력은 모든 테이블을 유지합니다.
큰 CJK 폰트도 처리되나요? 메모리는 얼마나 쓰나요?
처리되지만 크기 상한이 없고 파일 전체가 메모리에 올라갑니다. 본기 실측: 20.9 MB TTF가 8.6 MB WOFF2가 되며 약 55초, 메모리 약 350 MB. 16.9 MB Noto Sans SC는 약 39초, 약 400 MB였습니다. 처리 중 메인 스레드가 점유되어 페이지가 멈추므로 가능하면 폰트 서브셋 도구로 먼저 서브셋하세요.
여러 폰트를 한 번에 일괄 변환할 수 있나요?
안 됩니다. 파일 선택은 한 개만 읽고(files[0]), 변환할 때마다 이전 결과를 덮어씁니다. 큐, 진행 목록, 드래그 앤 드롭 일괄 처리 모드는 없습니다.
완전 로컬인가요, 서버를 쓰나요?
완전히 로컬입니다. WOFF2 인코딩·디코딩은 data URI로 내장된 Emscripten WebAssembly 모듈에서 실행되고 WOFF 래핑은 JavaScript의 pako가 담당합니다. 폰트가 업로드되지 않아 라이선스 폰트도 안전하게 처리할 수 있습니다.
변환에 실패하면 어떻게 되나요? 다운로드 이름이 항상 font.*인 이유는?
실패하면 파일이 다운로드되지 않고 오류는 콘솔에만 기록됩니다. 성공 토스트는 Blob이 생성된 뒤에 표시됩니다. 다운로드 이름은 font.ttf·font.woff·font.woff2로 고정되어 있어 배포 전에 폰트 패밀리 이름으로 바꿔야 합니다.

