Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
[C/C++] 한글 판별 코드.

 

 

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

 

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

 

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)
About Me (1)
Programming (79)
Release Program (19)
Release Patch (14)
Programming Talk (46)
DISKER (1)
Release (1)
FSCH (7)
Core Release (1)
Plugin Release (6)
Dev. (0)
Caption (0)
러브 라이브 ! 1기 (0)
러브 라이브 ! 2기 (0)
B형 H계 (0)
프린세스 러버 ! (0)
etc... (0)
Rest Time ! (443)
Monologue (412)
Copy to Posting~ (31)
Hobby (64)
MYS-☆ (27)
Mahjong (12)
Animation (3)
Light Novel (0)
Blog skin (22)
Tour (5)
2013 Feb in Tokyo (5)
2014 Working Holiday JP (0)
2015 Aug in Tokyo (0)
2016 Dec in Osaka (0)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2025/04   »
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 :