아오... 만들긴 귀찮고, 인터넷에 이정돈 떠돌아 다니겠지 했는데 없음 -_- . . .
찾아도 죄다 유니코드로 판별.(이것조차도 불완전함.)
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