한글분리
|
판피린큐액 › 포커 › 프로그래머의 아내가 알아두어야 할 97가지 › 피터의원리 › 한국의아름다운길100선 › 한글분리 출처 : 미상
hangul.zip (2.31 KB) code
#ifndef HANGUL_INL
#define HANGUL_INL
//-----------------------------------------------------------------------------
// Hangul Class
//-----------------------------------------------------------------------------
class CHangul
{
public:
struct DATA
{
const short index;
const short type;
const wchar_t address;
const wchar_t code;
const wchar_t hangul;
const wchar_t first;
const wchar_t second;
};
public:
enum Type {UNKNOWN,ALPHABET,DIGIT,KOREAN,OTHERS};
Type m_code;
wchar_t m_str;
DATA * m_pInitial;
DATA * m_pMedial;
DATA * m_pFinal;
public:
CHangul (wchar_t hangul);
CHangul (wchar_t initial, wchar_t medial, wchar_t final);
static bool IsHangul (wchar_t hangul);
wchar_t Encode (wchar_t initial, wchar_t medial, wchar_t final);
bool Decode (wchar_t hangul, wchar_t* initial, wchar_t* medial, wchar_t* final);
protected:
DATA * GetInitialInfo (wchar_t initial);
DATA * GetMedialInfo (wchar_t medial);
DATA * GetFinalInfo (wchar_t final);
};
//-----------------------------------------------------------------------------
// 유저 타입 정의
//-----------------------------------------------------------------------------
#define MIN_HANGUL 0xAC00
#define MAX_HANGUL 0xD7A3
#define INITIAL_COUNT 19
#define MEDIAL_COUNT 21
#define FINAL_COUNT 28
#define INDEX_FINAL(c) (((c)-MIN_HANGUL)%FINAL_COUNT)
#define INDEX_MEDIAL(c) (((((c)-MIN_HANGUL)-INDEX_FINAL(c))/FINAL_COUNT)%MEDIAL_COUNT)
#define INDEX_MEDIAL_EX(c,f) (((((c)-MIN_HANGUL)-(f))/FINAL_COUNT)%MEDIAL_COUNT)
#define INDEX_INITIAL(c) (((((c)-MIN_HANGUL-INDEX_FINAL(c))/FINAL_COUNT)-INDEX_MEDIAL(c))/MEDIAL_COUNT)
#define INDEX_INITIAL_EX(c,m,f) (((((c)-MIN_HANGUL-(f))/FINAL_COUNT)-(m))/MEDIAL_COUNT)
#define IS_HANGUL(c) (((c)>=MIN_HANGUL)&&((c)<=MAX_HANGUL))
#define MAKE_HANGUL(i,m,f) (((((i)*MEDIAL_COUNT)+(m))*FINAL_COUNT)+(f)+MIN_HANGUL)
namespace GLOBAL {
//-----------------------------------------------------------------------------
// 초성 코드 테이블
//-----------------------------------------------------------------------------
const static CHangul::DATA INITIAL_CONSONANTS_TABLE [INITIAL_COUNT] =
{
{0x00, 1, 0x1100, 0x3131, L'ㄱ', 0, 0},
{0x01, 2, 0x1101, 0x3132, L'ㄲ',L'ㄱ',L'ㄱ'},
{0x02, 1, 0x1102, 0x3134, L'ㄴ', 0, 0},
{0x03, 1, 0x1103, 0x3137, L'ㄷ', 0, 0},
{0x04, 2, 0x1104, 0x3138, L'ㄸ',L'ㄷ',L'ㄷ'},
{0x05, 1, 0x1105, 0x3139, L'ㄹ', 0, 0},
{0x06, 1, 0x1106, 0x3141, L'ㅁ', 0, 0},
{0x07, 1, 0x1107, 0x3142, L'ㅂ', 0, 0},
{0x08, 2, 0x1108, 0x3143, L'ㅃ',L'ㅂ',L'ㅂ'},
{0x09, 1, 0x1109, 0x3145, L'ㅅ', 0, 0},
{0x0A, 2, 0x110A, 0x3146, L'ㅆ',L'ㅅ',L'ㅅ'},
{0x0B, 1, 0x110B, 0x3147, L'ㅇ', 0, 0},
{0x0C, 1, 0x110C, 0x3148, L'ㅈ', 0, 0},
{0x0D, 2, 0x110D, 0x3149, L'ㅉ',L'ㅈ',L'ㅈ'},
{0x0E, 1, 0x110E, 0x314A, L'ㅊ', 0, 0},
{0x0F, 1, 0x110F, 0x314B, L'ㅋ', 0, 0},
{0x10, 1, 0x1110, 0x314C, L'ㅌ', 0, 0},
{0x11, 1, 0x1111, 0x314D, L'ㅍ', 0, 0},
{0x12, 1, 0x1112, 0x314E, L'ㅎ', 0, 0}
};
//-----------------------------------------------------------------------------
// 중성 코드 테이블
//-----------------------------------------------------------------------------
const static CHangul::DATA MEDIAL_VOWELS_TABLE [MEDIAL_COUNT] =
{
{0x00, 1, 0x1161, 0x314F, L'ㅏ', 0, 0},
{0x01, 1, 0x1162, 0x3150, L'ㅐ', 0, 0},
{0x02, 1, 0x1163, 0x3151, L'ㅑ', 0, 0},
{0x03, 1, 0x1164, 0x3152, L'ㅒ', 0, 0},
{0x04, 1, 0x1165, 0x3153, L'ㅓ', 0, 0},
{0x05, 1, 0x1166, 0x3154, L'ㅔ', 0, 0},
{0x06, 1, 0x1167, 0x3155, L'ㅕ', 0, 0},
{0x07, 1, 0x1168, 0x3156, L'ㅖ', 0, 0},
{0x08, 1, 0x1169, 0x3157, L'ㅗ', 0, 0},
{0x09, 2, 0x116A, 0x3158, L'ㅘ', L'ㅗ', L'ㅏ'},
{0x0A, 2, 0x116B, 0x3159, L'ㅙ', L'ㅗ', L'ㅐ'},
{0x0B, 2, 0x116C, 0x315A, L'ㅚ', L'ㅗ', L'ㅣ'},
{0x0C, 1, 0x116D, 0x315B, L'ㅛ', 0, 0},
{0x0D, 1, 0x116E, 0x315C, L'ㅜ', 0, 0},
{0x0E, 2, 0x116F, 0x315D, L'ㅝ', L'ㅜ', L'ㅓ'},
{0x0F, 2, 0x1170, 0x315E, L'ㅞ', L'ㅜ', L'ㅔ'},
{0x10, 2, 0x1171, 0x315F, L'ㅟ', L'ㅜ', L'ㅣ'},
{0x11, 1, 0x1172, 0x3160, L'ㅠ', 0, 0},
{0x12, 1, 0x1173, 0x3161, L'ㅡ', 0, 0},
{0x13, 2, 0x1174, 0x3162, L'ㅢ', L'ㅡ', L'ㅣ'},
{0x14, 1, 0x1175, 0x3163, L'ㅣ', 0, 0}
};
//-----------------------------------------------------------------------------
// 종성 코드 테이블
//-----------------------------------------------------------------------------
const static CHangul::DATA FINAL_CONSONANTS_TABLE [FINAL_COUNT] =
{
{0x00, 0, 0x11A7, 0x0000, L'', 0, 0},
{0x01, 1, 0x11A8, 0x3131, L'ㄱ', 0, 0},
{0x02, 2, 0x11A9, 0x3132, L'ㄲ', L'ㄱ', L'ㄱ'},
{0x03, 2, 0x11AA, 0x3133, L'ㄳ', L'ㄱ', L'ㅅ'},
{0x04, 1, 0x11AB, 0x3134, L'ㄴ', 0, 0},
{0x05, 2, 0x11AC, 0x3135, L'ㄵ', L'ㄴ', L'ㅈ'},
{0x06, 2, 0x11AD, 0x3136, L'ㄶ', L'ㄴ', L'ㅎ'},
{0x07, 1, 0x11AE, 0x3137, L'ㄷ', 0, 0},
{0x08, 1, 0x11AF, 0x3139, L'ㄹ', 0, 0},
{0x09, 2, 0x11B0, 0x313A, L'ㄺ', L'ㄹ', L'ㄱ'},
{0x0A, 2, 0x11B1, 0x313B, L'ㄻ', L'ㄹ', L'ㅁ'},
{0x0B, 2, 0x11B2, 0x313C, L'ㄼ', L'ㄹ', L'ㅂ'},
{0x0C, 2, 0x11B3, 0x313D, L'ㄽ', L'ㄹ', L'ㅅ'},
{0x0D, 2, 0x11B4, 0x313E, L'ㄾ', L'ㄹ', L'ㅌ'},
{0x0E, 2, 0x11B5, 0x313F, L'ㄿ', L'ㄹ', L'ㅍ'},
{0x0F, 2, 0x11B6, 0x3140, L'ㅀ', L'ㄹ', L'ㅎ'},
{0x10, 1, 0x11B7, 0x3141, L'ㅁ', 0, 0},
{0x11, 1, 0x11B8, 0x3142, L'ㅂ', 0, 0},
{0x12, 2, 0x11B9, 0x3144, L'ㅄ', L'ㅂ', L'ㅅ'},
{0x13, 1, 0x11BA, 0x3145, L'ㅅ', 0, 0},
{0x14, 2, 0x11BB, 0x3146, L'ㅆ', L'ㅅ', L'ㅅ'},
{0x15, 1, 0x11BC, 0x3147, L'ㅇ', 0, 0},
{0x16, 1, 0x11BD, 0x3148, L'ㅈ', 0, 0},
{0x17, 1, 0x11BE, 0x314A, L'ㅊ', 0, 0},
{0x18, 1, 0x11BF, 0x314B, L'ㅋ', 0, 0},
{0x19, 1, 0x11C0, 0x314C, L'ㅌ', 0, 0},
{0x1A, 1, 0x11C1, 0x314D, L'ㅍ', 0, 0},
{0x1B, 1, 0x11C2, 0x314E, L'ㅎ', 0, 0}
};
}
//-----------------------------------------------------------------------------
// 생성자
//-----------------------------------------------------------------------------
inline CHangul::CHangul (wchar_t hangul) : m_pInitial(0),m_pMedial(0),m_pFinal(0)
{
DATA* pTemp = 0;
if (IsHangul (hangul))
{
m_str = hangul;
wchar_t i=0, m=0, f=0;
if (Decode (hangul, &i, &m, &f))
{
int final_index = INDEX_FINAL (hangul);
int medial_index = INDEX_MEDIAL_EX (hangul, final_index);
int initial_index = INDEX_INITIAL_EX (hangul, medial_index, final_index);
m_pInitial = (DATA*)&GLOBAL::INITIAL_CONSONANTS_TABLE [initial_index];
m_pMedial = (DATA*)&GLOBAL::MEDIAL_VOWELS_TABLE [medial_index];
m_pFinal = (DATA*)&GLOBAL::FINAL_CONSONANTS_TABLE [final_index];
m_code = KOREAN;
}
}
else if ((pTemp = GetInitialInfo (hangul)) != 0)
{
m_str = hangul;
m_pInitial = pTemp;
m_code = KOREAN;
}
else if ((pTemp = GetMedialInfo (hangul)) != 0)
{
m_str = hangul;
m_pMedial = pTemp;
m_code = KOREAN;
}
else if ((pTemp = GetFinalInfo (hangul)) != 0)
{
m_str = hangul;
m_pFinal = pTemp;
m_code = KOREAN;
}
else
{
// error
throw "other language.";
}
}
//-----------------------------------------------------------------------------
// 생성자
//-----------------------------------------------------------------------------
inline CHangul::CHangul (wchar_t initial, wchar_t medial, wchar_t final) :
m_pInitial(0),m_pMedial(0),m_pFinal(0)
{
wchar_t hangul = Encode (initial, medial, final);
if (IsHangul (hangul))
{
m_str = hangul;
wchar_t i=0, m=0, f=0;
if (Decode (hangul, &i, &m, &f))
{
int final_index = INDEX_FINAL (hangul);
int medial_index = INDEX_MEDIAL_EX (hangul, final_index);
int initial_index = INDEX_INITIAL_EX (hangul, medial_index, final_index);
m_pInitial = (DATA*)&GLOBAL::INITIAL_CONSONANTS_TABLE [initial_index];
m_pMedial = (DATA*)&GLOBAL::MEDIAL_VOWELS_TABLE [medial_index];
m_pFinal = (DATA*)&GLOBAL::FINAL_CONSONANTS_TABLE [final_index];
m_code = KOREAN;
}
}
else
throw hangul;
}
//-----------------------------------------------------------------------------
// 초성 상세 정보
//-----------------------------------------------------------------------------
inline CHangul::DATA* CHangul::GetInitialInfo (wchar_t initial)
{
for (int i = 0; i < INITIAL_COUNT; i++)
{
if (initial == GLOBAL::INITIAL_CONSONANTS_TABLE[i].code)
return (DATA*)&GLOBAL::INITIAL_CONSONANTS_TABLE[i];
}
return 0;
}
//-----------------------------------------------------------------------------
// 중성 상세 정보
//-----------------------------------------------------------------------------
inline CHangul::DATA* CHangul::GetMedialInfo (wchar_t medial)
{
for (int i = 0; i < MEDIAL_COUNT; i++)
{
if (medial == GLOBAL::MEDIAL_VOWELS_TABLE[i].code)
return (DATA*)&GLOBAL::MEDIAL_VOWELS_TABLE[i];
}
return 0;
}
//-----------------------------------------------------------------------------
// 종성 상세 정보
//-----------------------------------------------------------------------------
inline CHangul::DATA* CHangul::GetFinalInfo (wchar_t final)
{
for (int i = 0; i < FINAL_COUNT; i++)
{
if (final == GLOBAL::FINAL_CONSONANTS_TABLE[i].code)
return (DATA*)&GLOBAL::FINAL_CONSONANTS_TABLE[i];
}
return 0;
}
//-----------------------------------------------------------------------------
// Encode
//-----------------------------------------------------------------------------
inline wchar_t CHangul::Encode (wchar_t initial, wchar_t medial, wchar_t final)
{
if (initial == L'')
return L'';
if (medial == L'')
return initial;
int initial_index = GetInitialInfo (initial)->index;
int medial_index = GetMedialInfo (medial)->index;
int final_index = GetFinalInfo (final)->index;
wchar_t hangul = MAKE_HANGUL (initial_index, medial_index, final_index);
return IS_HANGUL (hangul) ? hangul : L'';
}
//-----------------------------------------------------------------------------
// Decode
//-----------------------------------------------------------------------------
inline bool CHangul::Decode (wchar_t hangul, wchar_t* initial, wchar_t* medial, wchar_t* final)
{
if (hangul == L'' || initial == 0 || medial == 0 || final == 0)
return false;
if (IS_HANGUL (hangul))
{
int final_index = INDEX_FINAL (hangul);
int medial_index = INDEX_MEDIAL_EX (hangul, final_index);
int initial_index = INDEX_INITIAL_EX (hangul, medial_index, final_index);
*initial = GLOBAL::INITIAL_CONSONANTS_TABLE[initial_index].code;
*medial = GLOBAL::MEDIAL_VOWELS_TABLE[medial_index].code;
*final = GLOBAL::FINAL_CONSONANTS_TABLE[final_index].code;
return true;
}
else
{
*initial = *medial = *final = 0;
return false;
}
}
//-----------------------------------------------------------------------------
// 한글인지 체크
//-----------------------------------------------------------------------------
inline bool CHangul::IsHangul (wchar_t hangul)
{
return IS_HANGUL (hangul);
}
//-----------------------------------------------------------------------------
#endif
|
- 전 이런 놈입니다.
격언> 우리가 진정 미워해야 할 사람이 세상에 흔한 것은 아니다. 정작 원수는 내 맞은편에 있는 것이 아니라, 내 마음속에 있을 때가 많기 때문이다. (알랭)
Recent Changes Echoes Of War(The... @ 2012-05-18 [03:44 pm] by windlesszone Diablo3 @ 2012-05-15 [04:49 pm] by windlesszone Diablo3/story/wizard @ 2012-05-15 [04:48 pm] by windlesszone 4 changes Diablo3/story/wit... @ 2012-05-15 [04:16 pm] by windlesszone Diablo3/story/monk @ 2012-05-15 [04:14 pm] by windlesszone
|

