1. 한글 입력
처리 과정 요약
2018. 05. 19
Seong-ho Cho <shcho@gnome.org>
GNOME Korea
2. libhangul (1/3)
• 키보드 입력을 받아 키 입력 값에 매핑한 유니코드 값(UCS4)을 가져와서
UTF-8로 인코딩한 한글 문자(열)을 반환한다.
• 자체 컨텍스트를 통해 스택 버퍼를 활용하여 preedit을 처리한다.
• 사용방법은 소스 코드(hangulinputcontext.c)에 잘 나와있다.
• 그러나 libhangul이 모든 문제를 다 해결해주지는 않는다 (…)
오로지 한글 입력 처리를 간편하게 해줄 뿐!
3. libhangul (2/3)
• 참고: 모든 소스 파일은 hangul/, hanja/ 에 있음
• hangul-gettext.h: gettext pre-definition
• hangul.h
• 전체 함수: 내/외부용, 키보드 배치 설정, 입력상태 확인, 한자 입력(사전)
• 상수: 자모, 자소, 음절글자, 초성 중성 채움
• 구조체: 키보드, 자모조합, 버퍼(스택버퍼 :P), 입력 컨텍스트,
한자, 한자 테이블, 한자 목록
• hangulinternals.h
• 종성 비교 함수
• 글자 입력 횟수(한글자 입력에 필요한 타수) 확인
• hangulkeyboard.h
• 키보드 배치별 아스키 코드 대응 초/중/종성 테이블
4. libhangul (3/3)
• hangulctype.c : 키 입력 검사, 한글 입력 상태 검사,
자모 조합, 초성 종성 변환, UTF-8 값 반환
• hangulinputcontext.c: 한글 입력 처리 함수 구현체 집합
(preedit, commit, append)
• hanja.c: 한자 입력 처리 함수 구현체 집합
5. ibus
• 지능형 입력(기) “프레임워크!” 서버
• 인풋 메서드, 메쏘드 라고도 하지만 그냥 입력”기”(automata
machine)라고 하자
• 뒤로는 x.org, wayland랑 붙는다. 기본은 gtk.
• 입력기 전체 동작을 “진행”하는 코어
6. ibus-hangul
• 인터페이스: PyGtk로 작성(설명은 생략)
• 대부분의 모든 동작 코드가 src/engine.c에 다 들어있다
• Note
• ibus_hangul_init() : 환경 초기화
• ibus_hangul_engine_class_init() : 콜백 바인딩
• ibus_hangul_engine_init() : 입력기 초기화
• ibus_hangul_engine_constructor() : GObject 생성자
. . . (지지고볶고) . . . Note: 인터페이스 이벤트와 관련된 처리 부분도 있다.
실제론 여기가 제일 중요한 부분.
• ibus_hangul_engine_destroy() : GObject 참조 해제 (객체 소멸 함수)
• ibus_hangul_exit() : 환경 초기화 해제(destructor)
7. 한글 처리 진행
자음
쌍
자음
자음
모음
겹
모음
모음
자음
쌍자음 커밋
자음 커밋
모음
모음
바,자,다,가,사
빠,짜,따,까,싸
모음
봐,좌,돠,과,솨
뽜,쫘,똬,꽈,쏴모음 커밋
자음
겹모음 커밋
뽞
백, 봭
닭, 돩
쀍
(쌍)자음+(겹)모음
(쌍)자음+(겹)모음+(겹)받침
commit + 자모입력
음절 미완성
주: 최근 입력기는 자모 입력 순서 대로만
음절 완성 처리를 하지 않음!!
예) ㅜ -> ㅈㅇ = 중, but ㅜ->ㅈㅈㅇ = 줒ㅇ … (bug?)
8. 참고
• 입력 상태 문제는 입력기와 libhangul 외적인 부분에서 나타날
수도 있다(최근 들어 자주 있다)
• 좀 더 드러운(!?) 의식의 흐름 버전:
https://github.com/darkcircle/ManalithBot/blob/master/ManalithBot
/src/main/java/org/manalith/ircbot/plugin/keyseqconv/DubeolAuto
mataEngine.java#L141