Skip to content

글자 조합 방식·알고리즘 개요

한글 L/V/T, 일본어 로마자→가나, 중국어 병음→한자, 유럽 데드 키, 아랍 키→문자

IME와 글자 조합은 언어·입력 방식마다 알고리즘 유형이 다르다. 아래는 한글·일본어·중국어·유럽·아랍의 조합 방식알고리즘 요약을 정리한 것이다. 상세는 각 언어 문서를 참고한다.


1. 한글: L/V/T 상태 머신 + 완성형 공식

Section titled “1. 한글: L/V/T 상태 머신 + 완성형 공식”
  • 입력: 키 시퀀스(자음·모음). 2벌식은 같은 키가 초성/종성으로 해석되므로 상태 의존, 3벌식은 벌(키 위치) 로 초성/중성/종성 구분.
  • 내부 표현: L(초성 018), V(중성 020), T(종성 0~27) 인덱스. 한 음절은 초성 → 중성 → (종성) 순서로만 쌓인다.
  • 출력: 완성형 한 글자 U+AC00~U+D7A3. 공식: S = 0xAC00 + (L×588) + (V×28) + T.
  • 겹모음: ㅗ+ㅏ→ㅘ 등 두 모음 시퀀스 → V 인덱스 하나(911, 1416, 19).
  • 겹받침: ㄱ+ㅅ→ㄳ 등 두 자음 시퀀스 → T 인덱스 하나(3,5,6,9~15,18).
  • 종성→다음 초성: commit 후 다음 음절 시작 시 T → L 변환표 사용.
  1. 키 → (L/V/T) 매핑(2벌식은 상태 의존, 3벌식은 벌별 테이블).
  2. 상태 전이: 초성만 / 초성+중성 / 초성+중성+종성. 모음 입력 시 겹모음 또는 commit+새 (L,V). 자음 입력 시 종성 또는 commit+새 L.
  3. 완성형 계산: 유효한 (L,V) 또는 (L,V,T)일 때 S = 0xAC00 + (L×588) + (V×28) + T.
  4. preedit/commit: 조합 중에는 preedit으로만 표시, commit 조건 시 문서에 반영.

참고: 한글 조합 원리, 2벌식 알고리즘, 3벌식 알고리즘, 한글 조합 규칙, 한글 입력기 구현.


2. 일본어: 로마자→가나 + 変換(한자 변환)

Section titled “2. 일본어: 로마자→가나 + 変換(한자 변환)”
  • 로마자→가나: 키 시퀀스(예: k, a) → 히라가나/가타카나(예: か). 로마자 표기법(Nihon-shiki, Hepburn 등)에 따른 변환 테이블 또는 규칙. 촉음(っ)은 다음 자음 앞에 っ.
  • 変換(한자 변환): 히라가나 문절 → 한자 후보 검색. 문절 단위로 공백·구두점 분리, 사전/엔진으로 후보 조회. 사용자가 후보 선택 시 preedit 갱신, Enter로 commit.
  • 출력: commit 시 히라가나·가타카나·한자 혼합 문자열.
  1. 로마자 시퀀스 → 가나: 변환 테이블(ka→か 등). 상태: 로마자 버퍼. commit: Enter·다음 문자 입력 시.
  2. 変換: 문절 분리 → 후보 검색 → 후보 선택 시 preedit 갱신 → Enter 시 commit.
  3. preedit/commit: 조합 중·변환 중에는 preedit, 확정 시 commit.

참고: 일본어 조합 원리, 일본어 입력기 구현.


  • 병음(또는 주음): 로마자 시퀀스(예: zhong) → 한자 후보 검색. 사전/엔진으로 병음 문자열에 대응하는 한자 목록 조회.
  • 후보 선택: 사용자가 숫자 키·방향 키로 후보 선택. 선택 중 preedit을 해당 한자로 갱신.
  • 출력: commit 시 한자(간체/번체). 성조(1~4)는 병음에 포함되거나 별도 키로, 후보 집합에 영향을 줄 수 있다.
  1. 병음 시퀀스 → 후보: 사전/엔진 검색. 상태: 병음 버퍼 또는 후보 인덱스.
  2. 후보 선택: 사용자 입력으로 preedit 갱신. Enter·숫자·클릭 시 commit.
  3. preedit/commit: 조합 중에는 병음 또는 첫 후보를 preedit, 확정 시 commit.

참고: 중국어 조합 원리, 중국어 입력기 구현.


  • 데드 키: “부호 키만 누름” → 다음 키 대기. 다음 키가 오면 “부호 + 문자” → 한 문자(예: é U+00E9). Space만 오면 부호만 출력(´).
  • Compose: Compose 키 + 두 키 시퀀스(예: ~ + n) → 한 문자(ñ U+00F1). 시퀀스 테이블(XCompose 등) 참고.
  • 출력: 미리 조합형(precomposed) 한 코드 포인트 또는 분해형(base + combining) 시퀀스. NFC/NFD 정규화로 통일하는 경우가 많다.
  1. 데드 키: 상태 = “데드 키 대기”. 다음 키 입력 시 (데드 키, 다음 키) → 결과 문자 테이블 조회. Space → 부호만 출력.
  2. Compose: 상태 = “Compose 대기”. 두 키 시퀀스 → Compose 테이블 조회.
  3. preedit/commit: 데드 키만 눌렀을 때 ´ 등을 preedit으로 표시할 수 있음. 완성 문자 입력 시 commit. (브라우저·OS에 따라 composition 없이 insertText만 오는 경우 있음.)

참고: 유럽권 조합 원리, 유럽권 입력기 구현.


5. 아랍어: 키→문자, 문맥형은 폰트

Section titled “5. 아랍어: 키→문자, 문맥형은 폰트”
  • 키→문자: 키 입력 → 유니코드 코드 포인트(U+0600~U+06FF 등). 자모→음절이 아니라 키→문자(또는 문자 시퀀스) 매핑.
  • 문맥형(이솔레이션·초·중·종형): 같은 코드 포인트위치(단독·어두·어중·어말)에 따라 다른 모양으로 그려진다. IME는 기본 코드 포인트만 보내고, 문맥형 선택은 폰트·렌더러가 한다(Joining_Type, UAX #9).
  • RTL: 텍스트는 논리 순서로 저장, 표시오른쪽→왼쪽 배치. bidi 알고리즘(UAX #9) 적용.
  1. 키→문자: 키 코드 → 문자 코드 포인트 테이블. (타슈킬 등 결합 부호가 있으면 composition 이벤트를 쓸 수 있음.)
  2. 문맥형: IME 구현에서는 불필요. 폰트·렌더러가 Joining_Type·주변 문자로 문맥형 선택.
  3. RTL·bidi: 에디터에서 논리 오프셋·시각적 위치 변환. UAX #9 적용.

참고: 아랍어 조합 원리, 아랍어 입력기 구현.


언어/방식입력내부 표현출력상태 의존
한글(2벌)키(자음/모음)L,V,T 인덱스완성형 S = 0xAC00+…있음(같은 키=초성/종성)
한글(3벌)키(초성/중성/종성 벌)L,V,T 인덱스동일없음(벌로 구분)
일본어로마자 시퀀스, 変換가나 버퍼, 후보가나·한자변환 모드
중국어병음 시퀀스후보 목록한자후보 선택
유럽데드 키, Compose 시퀀스(부호, 문자)precomposed/분해형데드 키 대기
아랍어코드 포인트문자(U+0600~)없음(문맥형은 폰트)

상세 알고리즘·키 매핑·겹모음·겹받침·종성→초성은 각 언어 문서와 한글 조합 규칙, 2벌식 알고리즘, 3벌식 알고리즘을 참고한다.