'코오드'에 해당되는 글 1건

  1. 2010.06.02 hangul, 한글.. by sloth_chord
/* 이 코드는 인터넷 모 게시판의 deadbeef님의 코드임미다. */

/* @file	dgr_cp949_util.h
 * @version	0.0.1, 2010-05-31 created.
 * @description
 * 		EUC-KR, CP949 문자열을 다루기 위한 유틸리티 헤더.
 */

#ifndef _DGR_CP949_UTIL_H_
#define _DGR_CP949_UTIL_H_

// KSC5601_1992 특수 문자 영역, " ":A1A1 ~ "я":ACF1
// 아래의 한글 자모 영역을 포함한다.
#define KSC5601_SPECIAL_CHAR_BEGIN	0xA1A1
#define KSC5601_SPECIAL_CHAR_END	0xACF1

#define KSC5601_SPECIAL_CHAR_MSB_BEGIN	0xA1
#define KSC5601_SPECIAL_CHAR_MSB_END	0xAC
#define KSC5601_SPECIAL_CHAR_LSB_BEGIN	0xA1
#define KSC5601_SPECIAL_CHAR_LSB_END	0xF1

// KSC5601_1992 한글 자모 영역, "ㄱ":A4A1 ~ "ㆎ":A4FE
#define KSC5601_JAMO_BEGIN			0xA4A1
#define KSC5601_JAMO_END			0xA4FE

#define KSC5601_JAMO_MSB_BEGIN		0xA4
#define KSC5601_JAMO_MSB_END		0xA4
#define KSC5601_JAMO_LSB_BEGIN		0xA1
#define KSC5601_JAMO_LSB_END		0xFE	

// KSC5601_1992 한자 영역, "伽":CAA1 ~ "詰":FDFE
#define KSC5601_HANJA_BEGIN			0xCAA1
#define KSC5601_HANJA_END			0xFDFE

#define KSC5601_HANJA_MSB_BEGIN		0xCA
#define KSC5601_HANJA_MSB_END		0xFD
#define KSC5601_HANJA_LSB_BEGIN		0xA1
#define KSC5601_HANJA_LSB_END		0xFE

// KSC5601_1992 한글 음절 영역, "가":0xB0A1 ~ "힝":0xC8FE, 2350 자
#define KSC5601_UMJEUL_BEGIN		0xB0A1
#define KSC5601_UMJEUL_END			0xC8FE

#define	KSC5601_UMJEUL_MSB_BEGIN	0xB0
#define	KSC5601_UMJEUL_MSB_END		0xC8
#define	KSC5601_UMJEUL_LSB_BEGIN	0xA1
#define	KSC5601_UMJEUL_LSB_END		0xFE

// 아래는 CP949(=UHC) 영역의 글자까지 모두 포함한 확장 완성형
// 음절 전부를 포함한다. 총 KSC5601_1992의 음절 영역 2350자와 합쳐져,
// 총 11172자로 구성된다.

// CP949 영역은 기존 KSC5601_1992 영역 이외에, 빈 구간에 Set 1, 2로 나뉘고
// 총 6개의 area에 나누어 매핑하였다. 2byte로 구성되므로,
// 상위 바이트(MSB)와 하위 바이트(LSB)로 검사를 실시하면 된다.

// UHC(Unified Hangul Code) 한글 음절 영역 Set 1-1, 0x8141~0xA05A, 832 자
#define CP949_EXTENDED_SET_1_1_SIZE			832

#define	CP949_EXTENDED_SET_1_MSB_BEGIN		0x81
#define	CP949_EXTENDED_SET_1_MSB_END		0xA0

#define	CP949_EXTENDED_SET_1_1_LSB_BEGIN	0x41
#define	CP949_EXTENDED_SET_1_1_LSB_END		0x5A

// UHC(Unified Hangul Code) 한글 음절 영역 Set 1-2, 0x8161~0xA07A, 832 자
#define CP949_EXTENDED_SET_1_2_SIZE			832

#define	CP949_EXTENDED_SET_1_2_LSB_BEGIN	0x61
#define	CP949_EXTENDED_SET_1_2_LSB_END		0x7A

// UHC(Unified Hangul Code) 한글 음절 영역 Set 1-3, 0x8181~0xA0FE, 4032 자
#define CP949_EXTENDED_SET_1_3_SIZE			4032

#define	CP949_EXTENDED_SET_1_3_LSB_BEGIN	0x81
#define	CP949_EXTENDED_SET_1_3_LSB_END		0xFE

// UHC(Unified Hangul Code) 한글 음절 영역 Set 2-1, 0xA141~0xC65A, 980자.
// 영역 자체의 넓이는 988이나, 실제 음절이 매핑된 영역은 980자 이며,
// 0xC653~0xC65A, 8개 영역이 빈 영역이다.
#define	CP949_EXTENDED_SET_2_1_SIZE			980

// 상위 바이트는 SET 2 모두 동일하다.
#define	CP949_EXTENDED_SET_2_MSB_BEGIN		0xA1
#define	CP949_EXTENDED_SET_2_MSB_END		0xC6

// 하위 바이트만 다르다.
#define CP949_EXTENDED_SET_2_1_LSB_BEGIN	0x41
#define CP949_EXTENDED_SET_2_1_LSB_END		0x5A

// Mapping 안된 영역.
#define CP949_EXTENDED_SET_2_1_UNMAPPED_BEGIN	0xC653
#define CP949_EXTENDED_SET_2_1_UNMAPPED_END		0xC65A

// 매핑 되지 않은 영역 검사시 경계. 하위 바이트만.
#define CP949_EXTENDED_SET_2_1_UNMAPPED_LSB_LOW		0x53
#define CP949_EXTENDED_SET_2_1_UNMAPPED_LSB_HIGH	0x5A

// UHC(Unified Hangul Code) 한글 음절 영역 Set 2-2, 0xA161~0xC67A, 962자.
// 영역 자체의 넓이는 988이나, 실제 음절이 매핑된 영역은 962자 이며,
// 0xC661~0xC67A, 26개 영역이 빈 영역이다.
#define	CP949_EXTENDED_SET_2_2_SIZE			962

// 하위 바이트만 다르다.
#define CP949_EXTENDED_SET_2_2_LSB_BEGIN	0x61
#define CP949_EXTENDED_SET_2_2_LSB_END		0x7A

// Mapping 안된 영역.
#define CP949_EXTENDED_SET_2_2_UNMAPPED_BEGIN	0xC661
#define CP949_EXTENDED_SET_2_2_UNMAPPED_END		0xC67A

// 매핑 되지 않은 영역 검사시 경계. 하위 바이트만.
#define CP949_EXTENDED_SET_2_2_UNMAPPED_LSB_LOW		0x61
#define CP949_EXTENDED_SET_2_2_UNMAPPED_LSB_HIGH	0x7A

// UHC(Unified Hangul Code) 한글 음절 영역 Set 2-3, 0xA181~0xC6A0, 1184자.
// 영역 자체의 넓이는 1216이나, 실제 음절이 매핑된 영역은 1184자 이며,
// 0xC681~0xC6A0, 32개 영역이 빈 영역이다.
#define	CP949_EXTENDED_SET_2_3_SIZE			1184

// 하위 바이트만 다르다.
#define CP949_EXTENDED_SET_2_3_LSB_BEGIN	0x81
#define CP949_EXTENDED_SET_2_3_LSB_END		0xA0

// Mapping 안된 영역.
#define CP949_EXTENDED_SET_2_3_UNMAPPED_BEGIN	0xC681
#define CP949_EXTENDED_SET_2_3_UNMAPPED_END		0xC6A0

// 매핑 되지 않은 영역 검사시 경계. 하위 바이트만.
#define CP949_EXTENDED_SET_2_3_UNMAPPED_LSB_LOW		0x81
#define CP949_EXTENDED_SET_2_3_UNMAPPED_LSB_HIGH	0xA0

// 전체적으로 봤을 때, 0xC653 ~ 0xC6A0 까지는 무조건 Unmapped area 이므로,
// MSB(상위 바이트)가 0xC6인 값이 앞의 구간 필터를 통과 한 경우 해당 구간을 체크하면 간단하게 해결된다.
#define CP949_UNMAPPED_AREA_BEGIN			0xC653
#define CP949_UNMAPPED_AREA_END				0xC6A0

#define CP949_UNMAPPED_AREA_MSB				0xC6
#define CP949_UNMAPPED_AREA_LSB_BEGIN		0x53
#define CP949_UNMAPPED_AREA_LSB_END			0xA0


// -------------------------------------------------------------------
// Data Type Definition
// -------------------------------------------------------------------

typedef union MBCHAR {
	unsigned char ubyte[2];
	unsigned short int uword;
	char byte[2];
	short int word;
} mbchar;

// -------------------------------------------------------------------
// Function Definition
// -------------------------------------------------------------------

#endif
#include "dgr_cp949_util.h"

// 해당 글자가 KSC5601_1992 자모 영역인지 알려준다.
// output
// 0 : (false)
// 1 : (true)
int is_cp949_jamo(mbchar om_char)
{
	if (om_char.uword >= KSC5601_JAMO_BEGIN &&
		om_char.uword <= KSC5601_JAMO_END)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

// 해당 Multibyte Character가 어떤 음절 구간인지 알려준다.
// output
// 	0 : (false)
// 	1~7: (true) 해당 구간이 어느 구간인지를 반환한다.
// 	단순히 false/true를 비교하는 경우 0을 체크하면 된다.
int is_cp949_umjeul(mbchar om_char)
{
	if ((om_char.ubyte[0] >= KSC5601_UMJEUL_MSB_BEGIN) &&
		(om_char.ubyte[0] <= KSC5601_UMJEUL_MSB_END) &&
		(om_char.ubyte[1] >= KSC5601_UMJEUL_LSB_BEGIN) &&
		(om_char.ubyte[1] <= KSC5601_UMJEUL_LSB_END))
	{
		return 1;
	}
	else if ((om_char.ubyte[0] >= CP949_EXTENDED_SET_1_MSB_BEGIN) &&
		(om_char.ubyte[0] <= CP949_EXTENDED_SET_1_MSB_END))
	{
		if ((om_char.ubyte[1] >= CP949_EXTENDED_SET_1_1_LSB_BEGIN) &&
			(om_char.ubyte[1] <= CP949_EXTENDED_SET_1_1_LSB_END))
		{
			return 2;
		}
		else if ((om_char.ubyte[1] >= CP949_EXTENDED_SET_1_2_LSB_BEGIN) &&
			(om_char.ubyte[1] <= CP949_EXTENDED_SET_1_2_LSB_END))
		{
			return 3;
		}
		else if ((om_char.ubyte[1] >= CP949_EXTENDED_SET_1_3_LSB_BEGIN) &&
			(om_char.ubyte[1] <= CP949_EXTENDED_SET_1_3_LSB_END))
		{
			return 4;
		}
		else
		{
			return 0;
		}
	}
	else if ((om_char.ubyte[0] >= CP949_EXTENDED_SET_2_MSB_BEGIN) &&
		(om_char.ubyte[0] <= CP949_EXTENDED_SET_2_MSB_END))
	{
		if ((om_char.ubyte[1] >= CP949_EXTENDED_SET_2_1_LSB_BEGIN) &&
			(om_char.ubyte[1] <= CP949_EXTENDED_SET_2_1_LSB_END))
		{
			// NOTICE: CP949_UNMAPPED_AREA_BEGIN 보다 크면 무조건 0이다.
			// 즉, AREA_END를 검사할 필요가 없다는 뜻.
			if (om_char.uword >= CP949_UNMAPPED_AREA_BEGIN)
				return 0;
			else
				return 5;
		}
		else if ((om_char.ubyte[1] >= CP949_EXTENDED_SET_2_2_LSB_BEGIN) &&
			(om_char.ubyte[1] <= CP949_EXTENDED_SET_2_2_LSB_END))
		{
			if (om_char.uword >= CP949_UNMAPPED_AREA_BEGIN)
				return 0;
			else
				return 6;
		}
		else if ((om_char.ubyte[1] >= CP949_EXTENDED_SET_2_3_LSB_BEGIN) &&
			(om_char.ubyte[1] <= CP949_EXTENDED_SET_2_3_LSB_END))
		{
			if (om_char.uword >= CP949_UNMAPPED_AREA_BEGIN)
				return 0;
			else
				return 7;
		}
	}
	else
	{
		return 0;
	}

	return 0;
}









Posted by sloth_chord
TAG

댓글을 달아 주세요