Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
[C/C++] 한글 판별 코드.
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2014. 12. 16. 09:44 ) | 신고

 

 

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

 

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

 

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

 

Category
분류 전체보기 (605)
Notice (6)
Programming (79)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2024/11   »
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
Total :
Today :
Yesterday :