korean hanja 구분

문자코드 구분

완성형 코드표에서 한글과 한자의 영역은 다음과 같습니다.

Quote:
완성형 글자 코드의 한글 영역: xxyyh (xx: B0h ~ C8h, yy: A1h ~ FEh)
완성형 글자 코드의 한자 영역: xxyyh (xx: CAh ~ FDh, yy: A1h ~ FEh)

따라서 글자가 한글인지 확인하려면 위의 두 범위 내에 드는지를 채크해 보면 되겠습니다. 참고로 다른 종류의 문자의 영역들은 다음과 같습니다. ‘a’, ‘+’같은 1바이트 문자(반각)는 여기에 포함되지 않습니다. 보기에는 같은 글자라도 2바이트 문자(전각)인 ‘a’, ‘+’와 1바이트 문자(반각)인 ‘a’, ‘+’는 전혀 틀린 문자입니다.

Quote:
A1A1h ~ A2E5h: 기호와 약자 몇가지
A3A1h ~ A3FEh: 전각 문자
A4A1h ~ A4FEh: 한글자모
A5A1h ~ A5AAh: 소문자 로마숫자 (i~x)
A5B0h ~ A5B9h: 대문자 로마숫자 (I ~ X)
A5C1h ~ A5D8h: 대문자 그리스 문자
A5E1h ~ A5F8h: 소문자 그리스 문자
A6A1h ~ A6E4h: 라인 문자
A7A1h ~ A7EFh: 단위
A8A1h ~ A8B0h: 대문자 발음기호
A8B1h ~ A8BEh: 원문자 한글 자음 (ㄱ~ㅎ)
A8BFh ~ A8CCh: 원문자 가나다 (가~하)
A8CDh ~ A8E6h: 원문자 영문 소문자 (a~z)
A8E7h ~ A8F5h: 원문자 숫자 (1~15)
A8B1h ~ A8BEh: 분수 (1/2, 1/3, 2/3, 1/4, 3/4, 1/8, 3/8, 5/8, 7/8)
A9A1h ~ A9B0h: 소문자 발음기호
A9B1h ~ A9BEh: 괄호문자 한글 자음 (ㄱ~ㅎ)
A9BFh ~ A9CCh: 괄호문자 가나다 (가~하)
A9CDh ~ A9E6h: 괄호문자 영문 소문자 (a~z)
A9E7h ~ A9F5h: 괄호문자 숫자 (1~15)
A9B1h ~ A9BEh: 위, 아래첨자 (1, 2, 3, 4, n, 1, 2, 3, 4)
ABA1h ~ ABF3h: 가타카나
ABA1h ~ ABF6h: 히라가나
ACA1h ~ ACC1h: 키릴 문자 대문자
ACD1h ~ ACF1h: 키릴 문자 소문자

예전에 만들어 두었던 게임에서 캐릭터 이름 등을 입력받아 유효성을 체크하는 필터 소스이다.

아스키에서의 특수문자 확인

Code:
enum
{
ERROR_NAME_OK,                                // OK
ERROR_NAME_MAX_LENGTH,                // 문자열 길이 초과.
ERROR_NAME_MIN_LENGTH,                // 문자열이 너무 짧음.
ERROR_NAME_SPECIAL_CODE,        // 특수코드 사용.
ERROR_NAME_VALUE,                        // 숫자 사용.
ERROR_NAME_BLINK_MORE,                // 공백 중복 사용.
};

int Check_Filter_Name( const char* buffer, int minLen, int maxLen )
{
int len = strlen(buffer);

// 길이 검사
// if( len > NAME_LEN )
if( len >= maxLen )
return ERROR_NAME_MAX_LENGTH;
else if( len < minLen )
return ERROR_NAME_MIN_LENGTH;

// 특수문자 검사
for( int x=0; x<len; ++x )
{
if( ((unsigned char)buffer[x]>= 0xB0 ) &&
((unsigned char)buffer[x] <= 0xC8 ) &&
((unsigned char)buffer[x+1] >= 0xA1) &&
((unsigned char)buffer[x+1] <= 0xFE ))
{
// 한글 해당 부분
x++;
continue;
}
else if( ( (unsigned char)buffer[x] >= 0xCA ) &&
( (unsigned char)buffer[x] <= 0xFD ) &&
( (unsigned char)buffer[x+1] >= 0xA1 ) &&
( (unsigned char)buffer[x+1] <= 0xFE) )
{
// 한자 해당 부분
return ERROR_NAME_SPECIAL_CODE;
}
else if ( ( ( (unsigned char)buffer[x] >= 0x41 ) &&
( (unsigned char)buffer[x] <= 0x5A ) ) ||
( ( (unsigned char)buffer[x] >= 0x61 ) &&
( (unsigned char)buffer[x] <= 0x7A) ) )
{
// 영어 해당 부분
continue;
}
else if ( ( buffer[x]>= ‘0’ ) && ( buffer[x] <= ‘9’ ) )
{
// 숫자 처리 부분
continue;
}
else if(( (unsigned char)buffer[x]>= 0xA1 ) &&
( (unsigned char)buffer[x+1] >= 0xA1 ) )
{
// 2byte special char
return ERROR_NAME_SPECIAL_CODE;
}
else
{
// 1byte special character
return ERROR_NAME_SPECIAL_CODE;
}
}

return ERROR_NAME_OK;
}

유니코드에서의 특수문자 확인 (영어, 숫자,완성된 한글을 제외하고 거르기

Code:
int len = (int)strSource.size();
for(int i = 0; i < len; i++)
{
// 숫자
if(strSource[i] >= 0x0030 && strSource[i] <= 0x0039)
continue;
// 영어 대소문자
else if( (strSource[i] >= 0x0041 && strSource[i] <= 0x005a) ||
(strSource[i] >= 0x0061 && strSource[i] <= 0x007a))
continue;
// 한글
else if((strSource[i] >= 0xAC00 && strSource[i] <= 0xD7A3))
continue;
else
return false;

// 현재는 숫자,영어,한글자로 완성된 한글만을 검색한다. ㅎㅎㅎ 같은것도 안됨.
// 한글 자모      1100 ~ 11FF
// 한글 호환 자모 3130 ~ 318F
// ㅎㅎ 이나 ㅋㅋㅋㅋ 같은 단어도 막을려면..
// 한글 자모 나 호환 자모로 사용하려면 따로 처리해야 한다.
}

_________________

Leave a Reply

Your email address will not be published. Required fields are marked *