drcarter의 DevLog

검색 엔진을 만들게 되면서...
한글 처리에 상당한 신경을 쓰게 되었습니다...
보통 검색 사이트에서 해주는 자동완성 검색들...
이 부분들은 대부분 한글들은 초중종성으로 분해되어 indexing이 되는 겁니다...
그럼 한글의 초중종성은 어떻게 분해를 하느냐...

한글은 기본적으로 2바이트의 multibyte를 쓰게 되죠... 영어는 1byte만 있어도 되지만...
이 부분을 처리하기 위해서는 single byte, multi-byte, unicode, utf-8에 대해서도 좀 알아야 할듯 싶기도 합니다...

서두가 좀 길긴 했습니다...
본론으로 들어가면...
한글을 자소 단위로 분리하기 위해서는 unicode로 된 한글이 필요하고...
그리고 분리하는 공식이 존재하게 되는겁니다.
 
nChar = Unicode - 0xAC00;
초성 index = nChar / (0x0015 * 0x001C);
중성 index = (nChar / 0x001C) % 0x0015;
종성 index = nChar % 0x001C;


Unicode는 한글 한 글자이고, 이 공식대로 하게 되면 초,중,종성의 index를 얻게 됩니다...
이런 index를 받게 되는거죠... 즉 순서...

음... 예제 코드를 드리자면
#include 
#include 
#include 

int main(void)
{
 setlocale(LC_ALL, "Korean");
 WORD in_char, in_cho, in_jung, in_jong;
 WORD result;

 printf("Input a letter : ");
 wscanf(L"%c", &in_char);
 
 // 초`중`종성 분해
 in_char = in_char - 0xAC00;
 //in_cho = in_char / (21 * 28);
 in_cho = in_char / (0x0015 * 0x001C);
 //in_jung = (in_char / 28) % 21;
 in_jung = (in_char / 0x001C) % 0x0015;
 //in_jong = in_char % 28;
 in_jong = in_char % 0x001C; 


 // 초`중`종성 print
 if ( in_jong == 0 )
  wprintf(L"%c => %c + %c\n", in_char + 0xAC00, in_cho + 0x1100, in_jung + 0x1161);
 else
  wprintf(L"%c => %c + %c + %c\n", in_char + 0xAC00, in_cho + 0x1100, in_jung + 0x1161, in_jong + 0x11A7);
}

이런식으로 하면 됩니다...

기본적으로 unicode표를 볼줄 아시는 분이라면...
이해가 빠르시리라 봅니다...

다음 글에서는 이렇게 분리한 한글을 다시 합치는 방법에 쓰도록 하겠습니다... :)