'programming'에 해당되는 글 387건

  1. 2017.12.05 한글 여부 판단

반응형

 

bool IsHangul(const char *input_text)
{
    bool is_hangul = true;

    while(*input_text)
    {

        char letter = *input_text;

        if(!(letter & 0x80))
        {

            is_hangul = false;
            break;

        }

        input_text++;

    }

    return is_hangul;

}


한글은 2byte가 한글자를 이루며 각 byte의 최상위 bit가 1이다.
때문에 다음과 같이 한글여부를 확인 할 수 있다.


const char* text = "한국";

(text[0] & 0x80) == 1 // 한글

(text[0] & 0x80) != 1 // 한글아님


출처: http://blog.naver.com/sipzirala/220183869886

 

/**
  * 한글인지 체크
  */
 public boolean isHangul(char c)
 {
  if (c < 0xAC00 || c > 0xD7A3)
   return false;
  return true;
 } 

 

예를 들어 첫글자의 문자가 한글인지 체크 하는 방법이다..

 

 

아오... 만들긴 귀찮고, 인터넷에 이정돈 떠돌아 다니겠지 했는데 없음 -_- . . .

 

찾아도 죄다 유니코드로 판별.(이것조차도 불완전함.)

 

ANSI 코드는 죄다 0x80 으로 비교분석하고 끝남.

( 이러면 문제가 되는게, 한글외 전각문자 예를 들면 ★, あ와 같은 것들도 한글로 처리됨. )

 

IsDBCSLeadByte 함수 또한 싱글바이트로 들어가서 순수 한글을 판단하는건 불가능함.

( 아마, 코드페이지에 해당하는 전각 문자열 범위로 판단하는듯 함. )

 

결론은 그냥 직접 작성함.

 

이거 어렵지 않고 단순 노가다인데 왜 안보이지 -_- . . .

( 검색어가 좋지 않았나 . . . )

 

//  IsHangulString

// Present by FORE

// http://foreblog.tistory.com/

 

#include <windows.h>


BOOL WINAPI IsHangulStringA(LPSTR lpString){
 BYTE   ch1,ch2;
 while(*lpString){
  ch1 = (BYTE)*lpString;
  if ( ch1 & 0x80 ){
   ch2 = (BYTE)*(lpString+1);
   if ( (ch1>0x80 && ch1<=0xA0) || (ch1>=0xB0 && ch1<=0xC5) ){
    if ( (ch2>0x40 && ch2<0x5B) || (ch2>0x60 && ch2<0x7B) || (ch2>0x80 && ch2<0xFF) )
     return TRUE;
   }
   else if ( ch1>0xA0 && ch1<0xB0 ){
    if ( (ch2>0x40 && ch2<0x5B) || (ch2>0x60 && ch2<0x7B) || (ch2>0x80 && ch2<0xA1) )
     return TRUE;
    if ( ch1 == 0xA4 ){ // 여기가 자모 코드. 자모 판별 필요 없을시 제거 가능.
     if ( ch2>0xA0 && ch2<0xFF )
      return TRUE;
    }
   }
   else if ( ch1 == 0xC6 ){
    if ( (ch2>0x40 && ch2<0x53 ) || (ch2>0xA0 && ch2<0xFF) )
     return TRUE;
   }
   else if ( ch1 > 0xC6 && ch1 < 0xC9 ){
    if ( ch2>0xA0 && ch2<0xFF )
     return TRUE;
   }
   lpString++;
  }
  lpString++;
 }
 return FALSE;
}

 

BOOL WINAPI IsHangulStringW(LPWSTR lpString){
 WCHAR   ch1;
 while(*lpString){
  ch1 = *lpString;
  if ( (ch1 >= 0xAC00 && ch1 <=0xD7A3)
   || (ch1 >= 0xA960 && ch1 <=0xA97C) // 이 밑부터 죄다 자모 코드
   || (ch1 >= 0xD7B0 && ch1 <=0xD7C6)
   || (ch1 >= 0xD7CB && ch1 <=0xD7FB)
   || (ch1 >= 0x3131 && ch1 <=0x318E) )
   return TRUE;
  lpString++;
 }
 return FALSE;
}

 

 

 

 

IsHangulStringA 의 수많은 if를 한줄로 줄이면

 

BOOL WINAPI IsHangulStringA(LPSTR lpString){
 BYTE   ch1,ch2;
 while(*lpString){
  ch1 = (BYTE)*lpString;
  if ( ch1 & 0x80 ){
   ch2 = (BYTE)*(lpString+1);
   if ( (((ch1>0x80 && ch1<=0xA0) || (ch1>=0xB0 && ch1<=0xC5)) && ((ch2>0x40 && ch2<0x5B) || (ch2>0x60 && ch2<0x7B) || (ch2>0x80 && ch2<0xFF)))
    || ((ch1>0xA0 && ch1<0xB0) && (ch2>0x40 && ch2<0x5B) || (ch2>0x60 && ch2<0x7B) || (ch2>0x80 && ch2<0xA1))
    || ((ch1 == 0xA4) && (ch2>0xA0 && ch2<0xFF))
    || ((ch1 == 0xC6) && ((ch2>0x40 && ch2<0x53 ) || (ch2>0xA0 && ch2<0xFF)))
    || ((ch1 > 0xC6 && ch1 < 0xC9) && (ch2>0xA0 && ch2<0xFF)) )
     return TRUE;
   lpString++;
  }
  lpString++;
 }
 return FALSE;
}

 

 

이리되는데, 결국 작동속도는 똑같을 것으로 보인다.

 

IsHangulString.c


 

http://foreblog.tistory.com/764

 

 

반응형
Posted by 공간사랑
,