태국어 입력기 구현
자음·모음·성조 시퀀스, 그래핀·단어 경계, 플랫폼 preedit·commit
태국어 입력기는 자음·모음·성조 키 시퀀스를 OS가 한 음절(여러 코드 포인트일 수 있음)로 조합한다. 태국어 조합 원리의 유니코드·그래핀·단어 경계 규칙을 엔진·에디터가 함께 지켜야 한다. 웹에서는 OS IME 결과만 처리하는 경우가 대부분이다.
1. 구현할 것 요약
- 키 매핑: 레이아웃(Pattachote 등)에 따라 물리 키 → 자음/모음/성조 코드 포인트(U+0E00~U+0E7F 및 결합 문자) 순서를 정한다.
- 조합 중(preedit): 음절이 완성되기 전 문자열을 preedit으로 표시. compositionupdate의
data가 그에 해당할 수 있다. - commit: 음절 확정 시 compositionend의
data또는 insertText의data를 문서에 반영. 한 번에 여러 코드 포인트가 들어올 수 있다. - 그래핀: 커서·Backspace·선택은 코드 유닛이 아니라 텍스트 세그멘테이션에 따른 그래핀 클러스터 경계를 쓴다.
Intl.Segmenter('th', { granularity: 'grapheme' }). - 단어 경계: 태국어는 공백 없이 이어 쓰는 경우가 많아, “단어 단위” 이동·삭제는 Intl.Segmenter
granularity: 'word', locale'th'또는 별도 분절기가 필요하다.
2. 유니코드·저장 형태
- 같은 음절이 precomposed 한 코드 포인트와 자음 + 결합 모음 + 결합 성조의 분해형으로 표현될 수 있다. 비교·검색 시 NFC/NFD 통일을 검토한다.
- IME 구현 시 출력 정규화를 고정하면 저장 형태가 일정해진다.
3. 웹·플랫폼에서의 이벤트
- Windows TSF / macOS / Linux(IBus·Fcitx): 태국어 입력기에 정리된 대로 preedit·commit을 전달한다.
- composition이 있으면 조합 구간만 임시 표시하고 compositionend에서 반영한다.
- composition 없이 insertText만 오는 환경에서는 composition 시나리오별 처리 규칙에 따라
insertText를 commit으로 처리한다.
4. 네이티브·자체 IME 시 추가 고려
- 음절 미완성 버퍼: 자음만 입력된 상태 등에서 표시할 preedit 문자열 규칙을 정한다.
- Backspace: 버퍼의 로마자가 아니라 유니코드 그래핀 단위로 지울지, IME 내부 버퍼만 지울지 정책을 맞춘다.
5. 에디터 구현 체크(태국어 특유)
- 그래핀 단위로 커서를 옮겨도 한 음절 중간에 서지 않는가.
- 단어 선택이 공백 기준이면 태국어에서 잘못된 범위가 되지 않는가. 필요 시
Intl.Segmenterword 사용. - compositionupdate가 자주 올 때 성능·렌더링 배치 전략(프레임당 한 번 갱신 등)이 있는가.
6. 참고
- 태국어 조합 원리 — 자음·모음·성조, 그래핀, 단어 경계
- 태국어 입력기 — OS별
- 인도계 문자 입력기 구현 — 복잡 문자계 공통(그래핀·정규화)
- 에디터 IME 구현 가이드