2010/01/21 15:14
[Others]
작성하기 빡시다
천지인좀...

iPhone 에서 작성된 글입니다.
천지인좀...
iPhone 에서 작성된 글입니다.
'Others' 카테고리의 다른 글
| I-phone으로 블로깅그~ (0) | 2010/01/21 |
|---|---|
| IP 주소 변경하기 (0) | 2009/11/18 |
| Mobilink UltraLite (0) | 2009/07/14 |
| Telnet으로 html 소스 보기 (0) | 2009/06/25 |
| VoiceXML이 뭐야? (0) | 2009/06/24 |
2009/12/28 20:41
[C++]
한글 오토마타에 대하여...
PDA의 키보드를 만들어야 할 상황이 있어서 제작을 해보았다.
UI는 따로 처리된 DLL에서 호출하여 사용하는 방식이고 키 코드를 넘겨 받아서 한글 조합을 하고 있다.
이번에 제작한 오토마타는 유니코드(0xac00 ~ 0xd7a3 범위)내의 한글코드를 처리하고 있다.
때문에 표현 불가능한 글자가 몇개 있는 것 같다.
아니 정확하게 표현 불가능한 코드가 있다.
하지만 입력 방식이 키보드가 아닌 키 코드의 입력 방식이기 때문에 문제는 되지 않았다. 또한 PDA는 유니코드를 사용하니 일단 사용자 범주안에서는 OK 이다.!!
문제는 키보드 입력방식에 적용이 어렵다.
이부분은 보완하여 수정해봐야 겠다.
Define 한 키 코드의 입력이 아닌 char 값을 입력 받을 수 있도록 추가로 처리를 해야 할 것 같다.
소스를 올리기 전에 간단한 한글 오토마타 와 한글 형태소 분리에 대한 설명을 해야 할 것 같다.
※ 본문 내용의 오토마타 구현 과정은 핸드폰과 같이 키의 조합이 키보드와는 다른 모형을 기준으로 하고 있다. 기본 원리를 파악하면 키의 배열이나 키의 숫자가 달라진다고 하여 문제가 될 것은 없는 것 같다.
한글 형태소 분리
{
간단하게 설명하고 끝내려 한다.자세하게 설명 되어있는 사이트는 찾아보니 생각보다 많이 있었다.
그리고 내가 그 사이트 보다 자세하게 설명할 자신도 없다.
}
한글코드의 기본개념: http://paero3.myzip.co.kr/hangeul_code/index.html 찾아가서 보면 너무너무 설명을 잘 하고 있다.
원문의 내용을 필요한 부분만 간단 요약 하면 이렇다.
윈도우의 한글코드 : Microsoft의 통합형 한글(확장 완성형 코드:2350자)
확장 완성형 코드 = (기존 완성형 코드 영역 0xB0A1~0xC8FE) + (0x8141~0xC6FE 부분에 한글을 추가)
완성형 코드
정의:
완성형 방식은, 완성된 글자를 일종의 그림처럼 다루는 방식이다. 따라서 그 발상의 밑바탕에서 바라봤을 때는, 한자 같은 상형문자를 다루는 방식과 근본적으로 아무 차이점이 없다. 그리고 그게 '가나다' 순서를 지키려면, 이미 글자 체계 또한 완성되었다고 본 후 코드를 배열해야 한다. 유니코드 2.0의한글 배열은, 현대 한글에서 조합 가능한 숫자 '11,172'자를 쭉 순서대로 배열해 놓았다. 즉 '2바이트 완성형' 방식이다.
크기: 2바이트
자주 쓰이는 한글 2350자를 골라 가나다 순으로 배치
0xB0A1~0xC8FE: 차례대로 코드 부여
상위 바이트 0xB0 ~ 0xC8
하위 바이트 0xA1~ 0xFE
조합형 코드
정의:
조합형 방식은, 한글 글자의 구성 원리인 초성-중성-종성의 세 갈래 음운을 코드 자료로 삼아 설계된다. 따라서 여기에서는 완성된 글자에 초점이 있는 게 아니라, 각 음운들에 초점이 놓인다.
크기: 2바이트
상위 1비트: 아스키 코드와 구분하기 위해 사용
다음 5비트: 초성
다음 5비트: 중성
다음 5비트: 종성
핵심은?...
첫번째 논점은 한글글자를 초성 + 중성 + 종성 으로 분리해 내는 것이다. 그리고 반대로 한글자모(자음,모음)가 입력될 때 이미 입력되어 있던 한글자모와 조합하여 완성시키는 것이다.
조합 완성된 글자 와 한글자모 사이에는 다음과 같은 수식이 적용된다.
초성(19자)
– ㄱ(0) ㄲ(1) ㄴ(2) ㄷ(3) ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ(15) ㅌ(16) ㅍ(17) ㅎ(18)
중성(21자)
– ㅏ(0) ㅐ(1) ㅑ(2) ㅒ(3) ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ(17) ㅡ(18) ㅢ(19) ㅣ(20)
종성(28자)
– 없음(0) ㄱ(1) ㄲ(2) ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ(26) ㅎ(27)
표현범위 : 가(0xAC00) ~ 힣(D7A3)
두번째 임의로 입력되어지는 한글자모를 받아서 이전에 입력되어진 한글자모와 한글조합이 이루어 지는지의 판단과 처리 및 이후 프로세스의 정립에 있다.
소스코드
초기모델
초기 제작한 모델은 아파트를 쓰기위해서 항상 띄어쓰기를 입력하여 문자입력을 종료시켜야 되었다.
때문에 이런 문제들을 확인 후 몇가지를 수정하여 소스를 다듬었다. 초성, 중성, 종성 합성 테이블을 두어 테이블 내에서 변환을 조절하였다.
다음에 오는 소스코드는 나름 정리를 한다고 한 모습임에도 정리가 않되고 있다.
포스팅을 하면서 이것저것 웹서핑을 통하여 찾아보았다. 다행이도 어느정도는 오토마타라는 표현에 구색을 맞추지 않았나 생각이 든다. 갱장이 복잡하게 처리하고 있는 어떤 소스를 웹서핑 중에 확인하였지만 중요한 골격이 되는 알고리즘(? 그냥 단순한 프로세스 정도인가....)은 크게 다르지 않은가 라고 생각이 된다. 누군가 고수님이 이 포스팅을 확인하고 지적해 준다면 정말 감사하겠다. 어찌되었든 잘 돌아가고 있는 모습을 볼때에는 참 뿌듯할 뿐이다. 이 프로세스 유도하기 위해 빽보드에 ㄱ,ㄴ,ㄷ을 무수히 써보기만 했다. ㅋㅋ
keenam님께서 덧글로 지적해 주신 부분을 수정하였습니다.
정말 감사합니다.
최근 학습의 열의가 많이 떨어져 있습니다. 어쩌면 좋을까요 ^^;;
관심 가져주시는 분들께 감사를 드립니다. 꾸벅
keenam 님이 다시 지적해주신 부분이 있었습니다. (;ㅁ;) 눈물이 앞을 가립니다. 아~
종성이 곁자음이 아닐경우 지우기 키를 입력하였을때 무조건 종성을 삭제하는 부분을 수정하여 반영하였습니다. 그리고 변수명 및 Function 명을 좀더 의미 있는 단어로 수정 처리하였습니다.
히스토리)
이렇게까지 관심이 높아질줄 몰랐습니다.
그리고 이렇게 보완이 될지 몰랐습니다.
앞으로는 히스토리 관리를 해줘야 할것 같습니다.
PDA의 키보드를 만들어야 할 상황이 있어서 제작을 해보았다.
UI는 따로 처리된 DLL에서 호출하여 사용하는 방식이고 키 코드를 넘겨 받아서 한글 조합을 하고 있다.
이번에 제작한 오토마타는 유니코드(0xac00 ~ 0xd7a3 범위)내의 한글코드를 처리하고 있다.
때문에 표현 불가능한 글자가 몇개 있는 것 같다.
아니 정확하게 표현 불가능한 코드가 있다.
하지만 입력 방식이 키보드가 아닌 키 코드의 입력 방식이기 때문에 문제는 되지 않았다. 또한 PDA는 유니코드를 사용하니 일단 사용자 범주안에서는 OK 이다.!!
문제는 키보드 입력방식에 적용이 어렵다.
이부분은 보완하여 수정해봐야 겠다.
Define 한 키 코드의 입력이 아닌 char 값을 입력 받을 수 있도록 추가로 처리를 해야 할 것 같다.
소스를 올리기 전에 간단한 한글 오토마타 와 한글 형태소 분리에 대한 설명을 해야 할 것 같다.
※ 본문 내용의 오토마타 구현 과정은 핸드폰과 같이 키의 조합이 키보드와는 다른 모형을 기준으로 하고 있다. 기본 원리를 파악하면 키의 배열이나 키의 숫자가 달라진다고 하여 문제가 될 것은 없는 것 같다.
한글 형태소 분리
{
간단하게 설명하고 끝내려 한다.자세하게 설명 되어있는 사이트는 찾아보니 생각보다 많이 있었다.
그리고 내가 그 사이트 보다 자세하게 설명할 자신도 없다.
}
한글코드의 기본개념: http://paero3.myzip.co.kr/hangeul_code/index.html 찾아가서 보면 너무너무 설명을 잘 하고 있다.
원문의 내용을 필요한 부분만 간단 요약 하면 이렇다.
윈도우의 한글코드 : Microsoft의 통합형 한글(확장 완성형 코드:2350자)
확장 완성형 코드 = (기존 완성형 코드 영역 0xB0A1~0xC8FE) + (0x8141~0xC6FE 부분에 한글을 추가)
완성형 코드
정의:
완성형 방식은, 완성된 글자를 일종의 그림처럼 다루는 방식이다. 따라서 그 발상의 밑바탕에서 바라봤을 때는, 한자 같은 상형문자를 다루는 방식과 근본적으로 아무 차이점이 없다. 그리고 그게 '가나다' 순서를 지키려면, 이미 글자 체계 또한 완성되었다고 본 후 코드를 배열해야 한다. 유니코드 2.0의한글 배열은, 현대 한글에서 조합 가능한 숫자 '11,172'자를 쭉 순서대로 배열해 놓았다. 즉 '2바이트 완성형' 방식이다.
크기: 2바이트
자주 쓰이는 한글 2350자를 골라 가나다 순으로 배치
0xB0A1~0xC8FE: 차례대로 코드 부여
상위 바이트 0xB0 ~ 0xC8
하위 바이트 0xA1~ 0xFE
조합형 코드
정의:
조합형 방식은, 한글 글자의 구성 원리인 초성-중성-종성의 세 갈래 음운을 코드 자료로 삼아 설계된다. 따라서 여기에서는 완성된 글자에 초점이 있는 게 아니라, 각 음운들에 초점이 놓인다.
크기: 2바이트
상위 1비트: 아스키 코드와 구분하기 위해 사용
다음 5비트: 초성
다음 5비트: 중성
다음 5비트: 종성
핵심은?...
첫번째 논점은 한글글자를 초성 + 중성 + 종성 으로 분리해 내는 것이다. 그리고 반대로 한글자모(자음,모음)가 입력될 때 이미 입력되어 있던 한글자모와 조합하여 완성시키는 것이다.
조합 완성된 글자 와 한글자모 사이에는 다음과 같은 수식이 적용된다.
초성(19자)
– ㄱ(0) ㄲ(1) ㄴ(2) ㄷ(3) ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ(15) ㅌ(16) ㅍ(17) ㅎ(18)
중성(21자)
– ㅏ(0) ㅐ(1) ㅑ(2) ㅒ(3) ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ(17) ㅡ(18) ㅢ(19) ㅣ(20)
종성(28자)
– 없음(0) ㄱ(1) ㄲ(2) ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ(26) ㅎ(27)
표현범위 : 가(0xAC00) ~ 힣(D7A3)
한글글자 = 초성 * 21 * 28 + (중성 - 19) * 28 + (종성 - 40) + 1BASE_CODE(한글코드 테이블의 첫번째 문자코드)
예) 강 = ㄱ + ㅏ + ㅇ
= 0 * 21 * 28 + (19 - 19) * 28 + (61 - 40) + 0xAC00 = 0xAC00(44032) + 21
= 44053
= 0xAC15
두번째 임의로 입력되어지는 한글자모를 받아서 이전에 입력되어진 한글자모와 한글조합이 이루어 지는지의 판단과 처리 및 이후 프로세스의 정립에 있다.
위에 보여지는 키패드의 그림상 아파트를 입력하려면 다음과 같은 순서에 의해 입력이 되어진다.세번째 키의 배열과 조합의 순서도 중요하다. 위의 키패드 배열을 보면 ㅂ, ㅍ 이 한쌍을 이루고 ㄱ,ㅋ 이 한쌍을 이룬다. 이것은 우리가 기존에 사용해온 핸드폰의 영향도 있을 것이다. 그런데 왜 ㅡ, ㅣ는 순서가 바뀌어 있을까?...
아파트 = ㅇ + ㅏ + ㅂ + ㅂ + ㅏ + ㄷ + ㄷ + ㅣ + ㅣ (ㅇ) <- 초성
= 아 + ㅂ + ㅂ + ㅏ + ㄷ + ㄷ + ㅣ + ㅣ (ㅏ) <- 조합 초성 + 중성
= 압 + ㅂ + ㅏ + ㄷ + ㄷ + ㅣ + ㅣ (ㅂ) <- 조합 초성 + 중성 + 종성
= 앞 + ㅏ + ㄷ + ㄷ + ㅣ + ㅣ (ㅂ) <- 종성 합성
= 아파 + ㄷ + ㄷ + ㅣ + ㅣ (ㅏ) <- 완성문자 분해,조합 초성 + 중성
= 아팓 + ㄷ + ㅣ + ㅣ (ㄷ) <- 조합 초성 + 중성 + 종성
= 아팥 + ㅣ + ㅣ (ㄷ) <- 종성 합성
= 아파티 + ㅣ (ㅣ) <- 완성문자 분해, 초성 + 중성
= 아파트 (ㅣ) <- 중성 합성
(아파트 세글자를 찍기 위해 그렇게도 강대리는 날을 깟다 -_ㅠ)
간단한 예로 '애벌레'를 들어보겠다.
애벌레 = ㅇ + ㅏ + ㅣ + ㅂ + ㅓ + ㄹ + ㄹ + ㅓ + ㅣ
= 아 + ㅣ + ㅂ + ㅓ + ㄹ + ㄹ + ㅓ + ㅣ
= 애 + ㅂ + ㅓ + ㄹ + ㄹ + ㅓ + ㅣ
= 앱 + ㅓ + ㄹ + ㄹ + ㅓ + ㅣ
= 애버 + ㄹ + ㄹ + ㅓ + ㅣ
= 애벌 + ㄹ + ㅓ + ㅣ
= 애벌러 + ㅣ
= 애벌레
입력된 순서와 키의 입력을 보면 알겠지만 'l' 라는 음소는 조합에 많이 사용되는 문자이다. 때문에 키입력의 최초 입력에서 나와야 입력이 편하다. 만약 ㅡ 를 두번 입력해야 ㅣ 로 변경이 가능하다면 문자 하나를 찍는 것이 보통 힘든일이 아닐 것이다...
(키패드 중에 에니콜에 들어있는 키패드 배열(천지인인가...)이 가장 좋은 것 같다. LG, 모토로라,에버,에니콜 모든 핸드폰을 사용해 보았지만 그중에서도 모토로라는 정말 최악이다. 키의 배열이 한손으로 문자를 만들기가 너무 힘들다. PDA에 모아키라는 것이 있다...난 정말... 왜만들었지??)
소스코드
초기모델
초기 제작한 모델은 아파트를 쓰기위해서 항상 띄어쓰기를 입력하여 문자입력을 종료시켜야 되었다.
때문에 이런 문제들을 확인 후 몇가지를 수정하여 소스를 다듬었다. 초성, 중성, 종성 합성 테이블을 두어 테이블 내에서 변환을 조절하였다.
다음에 오는 소스코드는 나름 정리를 한다고 한 모습임에도 정리가 않되고 있다.
포스팅을 하면서 이것저것 웹서핑을 통하여 찾아보았다. 다행이도 어느정도는 오토마타라는 표현에 구색을 맞추지 않았나 생각이 든다. 갱장이 복잡하게 처리하고 있는 어떤 소스를 웹서핑 중에 확인하였지만 중요한 골격이 되는 알고리즘(? 그냥 단순한 프로세스 정도인가....)은 크게 다르지 않은가 라고 생각이 된다. 누군가 고수님이 이 포스팅을 확인하고 지적해 준다면 정말 감사하겠다. 어찌되었든 잘 돌아가고 있는 모습을 볼때에는 참 뿌듯할 뿐이다. 이 프로세스 유도하기 위해 빽보드에 ㄱ,ㄴ,ㄷ을 무수히 써보기만 했다. ㅋㅋ
AutomataKR.h
AutomataKR.cpp
코드가 길어지면 집중력이 떨어진다는 것을 다시 한번 느낌니다.keenam님께서 덧글로 지적해 주신 부분을 수정하였습니다.
정말 감사합니다.
최근 학습의 열의가 많이 떨어져 있습니다. 어쩌면 좋을까요 ^^;;
관심 가져주시는 분들께 감사를 드립니다. 꾸벅
keenam 님이 다시 지적해주신 부분이 있었습니다. (;ㅁ;) 눈물이 앞을 가립니다. 아~
종성이 곁자음이 아닐경우 지우기 키를 입력하였을때 무조건 종성을 삭제하는 부분을 수정하여 반영하였습니다. 그리고 변수명 및 Function 명을 좀더 의미 있는 단어로 수정 처리하였습니다.
히스토리)
2009.01.블로그에 올리기 까지의 히스토리는 정확하게 기억이 나지 않습니다.
- 초본 완성
2009.05.
- 버그 수정 후 블로그 등록
2009.09.30
- 모음합성시 발생하는 버그 < keenam님 제보
2009.11.11.
- 종성이 곁자음이 아닐 경우 지우기 키를 입력시 종성이 삭제되는 문제 < keenam님 제보
- 변수명 과 함수명 정리, 코딩 스타일(띄어쓰기, 내려쓰기, 주석) 정리
2009.12.28.
- 광고좀 넣어봤습니다. (굽신굽신)
이렇게까지 관심이 높아질줄 몰랐습니다.
그리고 이렇게 보완이 될지 몰랐습니다.
앞으로는 히스토리 관리를 해줘야 할것 같습니다.
- 유니코드(0xac00 ~ 0xd7a3 범위)에서 첫번째 한글코드 '가'는 0xAC00 이다. 따라서 BASE_CODE는 0xAC00 이다. [본문으로]
'C++' 카테고리의 다른 글
| 한글 오토마타 만들기 (20) | 2009/12/28 |
|---|---|
| 윈도우 몸통잡고 움직이기 OnNcHitTest (0) | 2009/11/26 |
| 대충만든 시계 (0) | 2009/06/26 |
| 후위표기 계산 (0) | 2009/06/25 |
| CListCtrl 에서 Checkbox 사용하기 (OnClick[NM_CLICK] 에서 Checkbox 클릭) (0) | 2009/06/24 |
| 윈도우 CE Cursor 처리 (0) | 2009/06/24 |
| Microsoft Visual C++ 단축키 (0) | 2009/06/21 |
|
Tracked from whitekid's me2DAY | 2010/01/25 15:57 | DEL
한글 오토마타 만들기::개발자 강대리 |