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 IsHangulStringW(LPWSTR lpString){ IsHangulStringA 의 수많은 if를 한줄로 줄이면
BOOL WINAPI IsHangulStringA(LPSTR lpString){ 이리되는데, 결국 작동속도는 똑같을 것으로 보인다. http://foreblog.tistory.com/764
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;
}
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;
}
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;
}