v2 — 본질 정정 (2026-05-02)
초기 가설 (Hangul Jamo Extended-A/B 폰트 fallback) 이 부정확함이 측정으로 확정. 실제 본질은 PUA 인코딩.
Stage 1 발견
samples/exam_kor.hwp p17 텍스트 추출 (rhwp export-text -p 16) 결과:
| 영역 |
발견 |
본 task v1 가설 정합 |
| Hangul Jamo (U+1100-11FF) |
0 |
❌ 가설 영역, 부재 |
| Hangul Jamo Extended-A (U+A960-A97F) |
0 |
❌ 가설 영역, 부재 |
| Hangul Jamo Extended-B (U+D7B0-D7FF) |
0 |
❌ 가설 영역, 부재 |
| Basic PUA (U+E000-F8FF) |
22 unique, 50 회 |
★ 실제 영역 |
| Supplementary PUA-A (U+F00DA, F0854, F0855) |
3 unique, 68 회 |
★ 실제 영역 |
→ 옛한글 음절이 한컴 자체 PUA 영역에 인코딩됨.
Issue #512 "PUA 옛한글 영역 KS X 1026-1:2007 자모 변환" 이 본 본질을 정확히 다루고 있음 → 본 task 가 #512 를 흡수.
증상
samples/exam_kor.hwp 페이지 17 의 중세국어 표기 미렌더:
'다'(되다), '(혼자)', '' 등 옛한글 음절 빈 글리프
- p17 만 약 25 종 PUA 옛한글 음절 (Basic PUA 22 + Supplementary PUA-A 3)
본질
HanCom 옛한글 인코딩 진화
| 한컴 버전 |
옛한글 인코딩 |
| 한/글 2010 이전 |
PUA (U+E000-F8FF + U+F0000+) — 한컴 자체 정의 |
| 한/글 2010+ |
KS X 1026-1:2007 자모 영역 (U+1100-11FF + U+A960-A97F + U+D7B0-D7FF) — 표준 |
exam_kor.hwp 는 한/글 2010+ 환경이지만 옛한글 입력은 이전 판 호환 (PUA) 으로 보존.
HncPUAConverter
한컴은 자체 변환 도구 (hncpuaconverter.htm) 제공:
HncPUAConverter.exe — PUA 영역 옛한글 → KS X 1026-1:2007 유니코드 자모 시퀀스 변환
rhwp 도 동일 변환을 자체 구현해야 정상 렌더링 가능.
한컴 PDF 가 정상 렌더되는 이유
한컴 자체 폰트 (함초롬바탕 LVT) 가 PUA 코드포인트에 옛한글 글리프 직접 보유. rhwp 는 라이선스로 이 폰트 사용 불가 → PUA 변환 필수.
해결안
변환 파이프라인
[원본 IR: PUA U+E38A 등]
↓ Composer 단계
[map_pua_old_hangul] — 매핑 표 룩업
↓
[KS X 1026-1 자모 시퀀스: U+1112 + U+1163 + U+11AB 등]
↓ Task #122 자모 클러스터 처리 (기존 인프라)
[자모 클러스터 → 폰트 합자 (CCMP/LJMO/VJMO/TJMO)]
↓
[Noto Serif KR 또는 Source Han Serif K Old Hangul]
작업 영역
- PUA 매핑 표 확보 — 오픈소스 자료원 (
pyhwp, hwp.js) + KS X 1026-1:2007 표준 + gen-pua 도구로 한컴 PDF 비교
- 변환 함수 구현 —
src/renderer/pua_oldhangul.rs (신규 모듈)
- Composer 통합 —
src/renderer/composer.rs::convert_pua_old_hangul
- 폰트 fallback 보강 (조건부) — Noto Serif KR 합자 미지원 시 본명조 (Source Han Serif K) Old Hangul subset 도입
- 광범위 회귀 + 작업지시자 시각 판정 (한컴 2010 / 2020 PDF 비교)
핵심 회귀 영역
산출물
mydocs/plans/task_m100_528.md v2
mydocs/plans/task_m100_528_impl.md v2
mydocs/working/task_m100_528_stage{1..4}.md
mydocs/report/task_m100_528_report.md
src/renderer/pua_oldhangul.rs (신규)
src/renderer/composer.rs (수정)
tests/pua_oldhangul.rs + tests/issue_528.rs (신규)
- (조건부) 폰트 자산 + style_resolver 갱신
마일스톤
v1.0.0 (M100)
참고
v2 — 본질 정정 (2026-05-02)
초기 가설 (Hangul Jamo Extended-A/B 폰트 fallback) 이 부정확함이 측정으로 확정. 실제 본질은 PUA 인코딩.
Stage 1 발견
samples/exam_kor.hwpp17 텍스트 추출 (rhwp export-text -p 16) 결과:→ 옛한글 음절이 한컴 자체 PUA 영역에 인코딩됨.
#512 흡수
Issue #512 "PUA 옛한글 영역 KS X 1026-1:2007 자모 변환" 이 본 본질을 정확히 다루고 있음 → 본 task 가 #512 를 흡수.
증상
samples/exam_kor.hwp페이지 17 의 중세국어 표기 미렌더:'다'(되다),'(혼자)',''등 옛한글 음절 빈 글리프본질
HanCom 옛한글 인코딩 진화
exam_kor.hwp는 한/글 2010+ 환경이지만 옛한글 입력은 이전 판 호환 (PUA) 으로 보존.HncPUAConverter
한컴은 자체 변환 도구 (hncpuaconverter.htm) 제공:
rhwp 도 동일 변환을 자체 구현해야 정상 렌더링 가능.
한컴 PDF 가 정상 렌더되는 이유
한컴 자체 폰트 (함초롬바탕 LVT) 가 PUA 코드포인트에 옛한글 글리프 직접 보유. rhwp 는 라이선스로 이 폰트 사용 불가 → PUA 변환 필수.
해결안
변환 파이프라인
작업 영역
pyhwp,hwp.js) + KS X 1026-1:2007 표준 +gen-pua도구로 한컴 PDF 비교src/renderer/pua_oldhangul.rs(신규 모듈)src/renderer/composer.rs::convert_pua_old_hangul핵심 회귀 영역
convert_pua_enclosed_numbersvs 본 task 옛한글) 검증산출물
mydocs/plans/task_m100_528.mdv2mydocs/plans/task_m100_528_impl.mdv2mydocs/working/task_m100_528_stage{1..4}.mdmydocs/report/task_m100_528_report.mdsrc/renderer/pua_oldhangul.rs(신규)src/renderer/composer.rs(수정)tests/pua_oldhangul.rs+tests/issue_528.rs(신규)마일스톤
v1.0.0 (M100)
참고