Thinking Different




유니코드를 입력하여 초성, 중성, 종성으로 분리 후 출력하는 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "stdafx.h"
#include <iostream>
#include <locale>
 
int start[3] = {0x1100, 0x1161, 0x11A8 - 1};
int value, cho, jung, jong;
 
 
bool extract(wchar_t *str)
{
    // 변수 초기화
    value = cho = jung = jong = 0;
 
    // 문자열 검사 (한글만 입력되었는가?)
    for(int i = 0; i<wcslen(str); i++)
    {
        // 유니코드 한글 문자열 범위 검사 (0xAC00 ~ 0xD7A3)
        if(str[i] < 0xAC00 || str[i] > 0xD7A3)    {
            if(str[i] == 0x20) continue;
            return false;
        }
    }
        
    for(int i = 0; i<wcslen(str); i++)
    {
        // 공백 검사
        if(str[i] == 0x20) {
            wprintf(L" ");    continue;
        }
 
        value = str[i] - 0xAC00;
        jong = value % 28;
        jung = ((value - jong) / 28) % 21;
        cho = ((value - jong) / 28 ) / 21;
 
        if(jong == 0x11A8) jong = 0;    
        cho += start[0]; jung += start[1]; jong += start[2];
 
        wprintf(L"%c %c %c", cho, jung, (jong == 0x11A8-1) ? NULL : jong);
    }
    printf("\n\n");
 
    return true;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Korean");
 
    wchar_t str[] = L"급할수록 돌아가라";
    wprintf(L"입력 : %s\n변환 : ", str);
 
    if(!extract(str))
        printf("한글 문자만 입력이 가능합니다\n");
 
    return 0;
}