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

20180519 hangul processing

  • 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