반응형

C 언어, 한글 초성 분리 

 

글.  오상문 sualchi@daum.net 

 

DevCpp에서 유니코드 영역 기준으로 한글 초성을 구하려는데  

윈도우 환경에서 CP949 코드를 사용하기에 다른 방법을 시도해봤습니다.

 

직접 글자를 비교하는 방법으로 초성을 구해봤는데 대충 맞는 것 같습니다. 

한글 코드가 자모순서(사전순)로 코드가 정렬되어 있다고 가정한 것입니다.

 

다만 일부 특수문자는 한글 코드 영역으로 오인하는 경우가 있었습니다.

 

 

/* 한글 초성 얻는 프로그램

 * C 언어 콘솔 프로그램  chosung.c

 * Windows 10 pro, DevCpp 5.11

 * 2018.07.13  by Sangmun Oh (sualchi@daum.net)

 */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

// 문자열에서 한글 초성만 돌려주는 함수

// s   : 초성을 구할 문자열

// cho: 초성을 담을 공간

// size: cho 크기

// 반환값: 초성 개수

int getChosung(const char* s, char* cho, int size)

{

  int i, j;

  int cnt, cho_index;

  char han[3] = {0,};

  static char * cho_list[] = {"", //index: 1(ㄱ)~14(ㅎ)

       "ㄱ","ㄴ","ㄷ","ㄹ","ㅁ","ㅂ","ㅅ","ㅇ","ㅈ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"};

 

  for(i=j=cnt=0; s[i] && i < size; i++) {

     if((unsigned char)s[i] & 0x80) {  // 한글이면...

      han[0] = s[i++];  // 한글(2바이트) 첫 바이트 분리

      han[1] = s[i];    // 한글 다음 바이트 분리

      // 시작, 끝 글자 범위인지 확인해서 초성 구함

      if(strcmp("가",han)<=0 && strcmp("나",han)>0)

         cho_index = 1;                               // ㄱ

      else if(strcmp("다",han)>0) cho_index = 2;  // ㄴ

      else if(strcmp("라",han)>0) cho_index = 3;  // ㄷ

      else if(strcmp("마",han)>0) cho_index = 4;  // ㄹ

      else if(strcmp("바",han)>0) cho_index = 5;  // ㅁ

      else if(strcmp("사",han)>0) cho_index = 6;  // ㅂ

      else if(strcmp("아",han)>0) cho_index = 7;  // ㅅ

      else if(strcmp("자",han)>0) cho_index = 8;  // ㅇ

      else if(strcmp("차",han)>0) cho_index = 9;  // ㅈ

      else if(strcmp("카",han)>0) cho_index = 10; // ㅊ

      else if(strcmp("타",han)>0) cho_index = 11; // ㅋ

      else if(strcmp("파",han)>0) cho_index = 12; // ㅌ

      else if(strcmp("하",han)>0) cho_index = 13; // ㅍ

      else cho_index = 14;                          // ㅎ

 

      cho[j++] = cho_list[cho_index][0];        // 초성 상위 바이트 저장

      cho[j++] = cho_list[cho_index][1];        // 초성 하위 바이트 저장

      cnt++;   // 초성 개수

    }

  }

  cho[j] = 0; // 문자열 널 종료 문자 추가

  return cnt; // 초성을 구한 개수

}

 

int main(int argc, char *argv[])

{

  char * str = "수알치 다산영재학원 대한민국만세 123abc!";

  char cho_str[101] = "";

 

  getChosung(str, cho_str, 100);

  printf("입력 내용: %s\n", str);

  printf("한글 초성: %s\n", cho_str);

 

  return 0;

}

 

<이상> 

 

반응형

+ Recent posts