검색 엔진을 만들게 되면서...
한글 처리에 상당한 신경을 쓰게 되었습니다...
보통 검색 사이트에서 해주는 자동완성 검색들...
이 부분들은 대부분 한글들은 초중종성으로 분해되어 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표를 볼줄 아시는 분이라면...
이해가 빠르시리라 봅니다...
다음 글에서는 이렇게 분리한 한글을 다시 합치는 방법에 쓰도록 하겠습니다... :)