글자 조합 방식·알고리즘 개요
한글 L/V/T, 일본어 로마자→가나, 중국어 병음→한자, 유럽 데드 키, 아랍 키→문자
IME와 글자 조합은 언어·입력 방식마다 알고리즘 유형이 다르다. 아래는 한글·일본어·중국어·유럽·아랍의 조합 방식과 알고리즘 요약을 정리한 것이다. 상세는 각 언어 문서를 참고한다.
1. 한글: L/V/T 상태 머신 + 완성형 공식
Section titled “1. 한글: L/V/T 상태 머신 + 완성형 공식”1.1 조합 방식
Section titled “1.1 조합 방식”- 입력: 키 시퀀스(자음·모음). 2벌식은 같은 키가 초성/종성으로 해석되므로 상태 의존, 3벌식은 벌(키 위치) 로 초성/중성/종성 구분.
- 내부 표현: L(초성 0
18), V(중성 020), T(종성 0~27) 인덱스. 한 음절은 초성 → 중성 → (종성) 순서로만 쌓인다. - 출력: 완성형 한 글자 U+AC00~U+D7A3. 공식:
S = 0xAC00 + (L×588) + (V×28) + T. - 겹모음: ㅗ+ㅏ→ㅘ 등 두 모음 시퀀스 → V 인덱스 하나(9
11, 1416, 19). - 겹받침: ㄱ+ㅅ→ㄳ 등 두 자음 시퀀스 → T 인덱스 하나(3,5,6,9~15,18).
- 종성→다음 초성: commit 후 다음 음절 시작 시 T → L 변환표 사용.
1.2 알고리즘 요약
Section titled “1.2 알고리즘 요약”- 키 → (L/V/T) 매핑(2벌식은 상태 의존, 3벌식은 벌별 테이블).
- 상태 전이: 초성만 / 초성+중성 / 초성+중성+종성. 모음 입력 시 겹모음 또는 commit+새 (L,V). 자음 입력 시 종성 또는 commit+새 L.
- 완성형 계산: 유효한 (L,V) 또는 (L,V,T)일 때 S = 0xAC00 + (L×588) + (V×28) + T.
- preedit/commit: 조합 중에는 preedit으로만 표시, commit 조건 시 문서에 반영.
참고: 한글 조합 원리, 2벌식 알고리즘, 3벌식 알고리즘, 한글 조합 규칙, 한글 입력기 구현.
2. 일본어: 로마자→가나 + 変換(한자 변환)
Section titled “2. 일본어: 로마자→가나 + 変換(한자 변환)”2.1 조합 방식
Section titled “2.1 조합 방식”- 로마자→가나: 키 시퀀스(예: k, a) → 히라가나/가타카나(예: か). 로마자 표기법(Nihon-shiki, Hepburn 등)에 따른 변환 테이블 또는 규칙. 촉음(っ)은 다음 자음 앞에 っ.
- 変換(한자 변환): 히라가나 문절 → 한자 후보 검색. 문절 단위로 공백·구두점 분리, 사전/엔진으로 후보 조회. 사용자가 후보 선택 시 preedit 갱신, Enter로 commit.
- 출력: commit 시 히라가나·가타카나·한자 혼합 문자열.
2.2 알고리즘 요약
Section titled “2.2 알고리즘 요약”- 로마자 시퀀스 → 가나: 변환 테이블(ka→か 등). 상태: 로마자 버퍼. commit: Enter·다음 문자 입력 시.
- 変換: 문절 분리 → 후보 검색 → 후보 선택 시 preedit 갱신 → Enter 시 commit.
- preedit/commit: 조합 중·변환 중에는 preedit, 확정 시 commit.
참고: 일본어 조합 원리, 일본어 입력기 구현.
3. 중국어: 병음→한자 후보
Section titled “3. 중국어: 병음→한자 후보”3.1 조합 방식
Section titled “3.1 조합 방식”- 병음(또는 주음): 로마자 시퀀스(예: zhong) → 한자 후보 검색. 사전/엔진으로 병음 문자열에 대응하는 한자 목록 조회.
- 후보 선택: 사용자가 숫자 키·방향 키로 후보 선택. 선택 중 preedit을 해당 한자로 갱신.
- 출력: commit 시 한자(간체/번체). 성조(1~4)는 병음에 포함되거나 별도 키로, 후보 집합에 영향을 줄 수 있다.
3.2 알고리즘 요약
Section titled “3.2 알고리즘 요약”- 병음 시퀀스 → 후보: 사전/엔진 검색. 상태: 병음 버퍼 또는 후보 인덱스.
- 후보 선택: 사용자 입력으로 preedit 갱신. Enter·숫자·클릭 시 commit.
- preedit/commit: 조합 중에는 병음 또는 첫 후보를 preedit, 확정 시 commit.
참고: 중국어 조합 원리, 중국어 입력기 구현.
4. 유럽권: 데드 키·Compose
Section titled “4. 유럽권: 데드 키·Compose”4.1 조합 방식
Section titled “4.1 조합 방식”- 데드 키: “부호 키만 누름” → 다음 키 대기. 다음 키가 오면 “부호 + 문자” → 한 문자(예: é U+00E9). Space만 오면 부호만 출력(´).
- Compose: Compose 키 + 두 키 시퀀스(예: ~ + n) → 한 문자(ñ U+00F1). 시퀀스 테이블(XCompose 등) 참고.
- 출력: 미리 조합형(precomposed) 한 코드 포인트 또는 분해형(base + combining) 시퀀스. NFC/NFD 정규화로 통일하는 경우가 많다.
4.2 알고리즘 요약
Section titled “4.2 알고리즘 요약”- 데드 키: 상태 = “데드 키 대기”. 다음 키 입력 시 (데드 키, 다음 키) → 결과 문자 테이블 조회. Space → 부호만 출력.
- Compose: 상태 = “Compose 대기”. 두 키 시퀀스 → Compose 테이블 조회.
- preedit/commit: 데드 키만 눌렀을 때 ´ 등을 preedit으로 표시할 수 있음. 완성 문자 입력 시 commit. (브라우저·OS에 따라 composition 없이 insertText만 오는 경우 있음.)
참고: 유럽권 조합 원리, 유럽권 입력기 구현.
5. 아랍어: 키→문자, 문맥형은 폰트
Section titled “5. 아랍어: 키→문자, 문맥형은 폰트”5.1 조합 방식
Section titled “5.1 조합 방식”- 키→문자: 키 입력 → 유니코드 코드 포인트(U+0600~U+06FF 등). 자모→음절이 아니라 키→문자(또는 문자 시퀀스) 매핑.
- 문맥형(이솔레이션·초·중·종형): 같은 코드 포인트가 위치(단독·어두·어중·어말)에 따라 다른 모양으로 그려진다. IME는 기본 코드 포인트만 보내고, 문맥형 선택은 폰트·렌더러가 한다(Joining_Type, UAX #9).
- RTL: 텍스트는 논리 순서로 저장, 표시 시 오른쪽→왼쪽 배치. bidi 알고리즘(UAX #9) 적용.
5.2 알고리즘 요약
Section titled “5.2 알고리즘 요약”- 키→문자: 키 코드 → 문자 코드 포인트 테이블. (타슈킬 등 결합 부호가 있으면 composition 이벤트를 쓸 수 있음.)
- 문맥형: IME 구현에서는 불필요. 폰트·렌더러가 Joining_Type·주변 문자로 문맥형 선택.
- RTL·bidi: 에디터에서 논리 오프셋·시각적 위치 변환. UAX #9 적용.
참고: 아랍어 조합 원리, 아랍어 입력기 구현.
6. 비교 요약
Section titled “6. 비교 요약”| 언어/방식 | 입력 | 내부 표현 | 출력 | 상태 의존 |
|---|---|---|---|---|
| 한글(2벌) | 키(자음/모음) | L,V,T 인덱스 | 완성형 S = 0xAC00+… | 있음(같은 키=초성/종성) |
| 한글(3벌) | 키(초성/중성/종성 벌) | L,V,T 인덱스 | 동일 | 없음(벌로 구분) |
| 일본어 | 로마자 시퀀스, 変換 | 가나 버퍼, 후보 | 가나·한자 | 변환 모드 |
| 중국어 | 병음 시퀀스 | 후보 목록 | 한자 | 후보 선택 |
| 유럽 | 데드 키, Compose 시퀀스 | (부호, 문자) | precomposed/분해형 | 데드 키 대기 |
| 아랍어 | 키 | 코드 포인트 | 문자(U+0600~) | 없음(문맥형은 폰트) |
상세 알고리즘·키 매핑·겹모음·겹받침·종성→초성은 각 언어 문서와 한글 조합 규칙, 2벌식 알고리즘, 3벌식 알고리즘을 참고한다.