DragonNest/Common/Protocol/DNCountryUnicodeSet.h
2024-12-19 09:48:26 +08:00

151 lines
5.9 KiB
C++

#pragma once
#include <hash_map>
// http://www.unicode.org/charts/
#define UNICODE_TYPE_ALL_START 0x0080 // 문자영역 전체
#define UNICODE_TYPE_ALL_END 0xFFFF
#define UNICODE_TYPE_NUM_START 0x0030 // 숫자
#define UNICODE_TYPE_NUM_END 0x0039
#define UNICODE_TYPE_ENG_BIG_START 0x0041 // 대문자
#define UNICODE_TYPE_ENG_BIG_END 0x005A
#define UNICODE_TYPE_ENG_SMALL_START 0x0061 // 소문자
#define UNICODE_TYPE_ENG_SMALL_END 0x007A
#define UNICODE_TYPE_HAN_SYLLABLES_START 0xAC00 // 가 ~ 힣
#define UNICODE_TYPE_HAN_SYLLABLES_END 0xD7A3
#define UNICODE_TYPE_SPECIAL_START 0x2100 // 특수문자
#define UNICODE_TYPE_SPECIAL_END 0x2AFF
#define UNICODE_TYPE_JPN_HIRAGANA_START 0x3040 // 히라가나
#define UNICODE_TYPE_JPN_HIRAGANA_END 0x309F
#define UNICODE_TYPE_JPN_KATAKANA_START 0x30A0 // 가타카나
#define UNICODE_TYPE_JPN_KATAKANA_END 0x30FF
#define UNICODE_TYPE_CJK_UNIFIED_START 0x4E00 // 한중일 통합 한자
#define UNICODE_TYPE_CJK_UNIFIED_END 0x9FBF
#define UNICODE_TYPE_CJK_COMP_START 0xF900 // 한중일 호환 한자
#define UNICODE_TYPE_CJK_COMP_END 0xFAFF
#define UNICODE_TYPE_SG_SPECIAL_A_START 0x002D // 싱가폴용 특별 허용문자
#define UNICODE_TYPE_SG_SPECIAL_A_END 0x002E
#define UNICODE_TYPE_SG_SPECIAL_B_START 0x0040 // 골뱅이 '@'
#define UNICODE_TYPE_SG_SPECIAL_B_END 0x0040
#define UNICODE_TYPE_SG_SPECIAL_C_START 0x005F // 언더바 '_'
#define UNICODE_TYPE_SG_SPECIAL_C_END 0x005F
#define UNICODE_TYPE_SG_SPECIAL_PASS_START 0x0021
#define UNICODE_TYPE_SG_SPECIAL_PASS_END 0x007F
#define UNICODE_TYPE_TH_START 0x0E01 // 태국어
#define UNICODE_TYPE_TH_THAI_END 0x0E5B
#define UNICODE_TYPE_TH_SPECIAL_A_START 0x0020 // 태국용 특별 허용문자
#define UNICODE_TYPE_TH_SPECIAL_A_END 0x0021
#define UNICODE_TYPE_TH_SPECIAL_B_START 0x0023
#define UNICODE_TYPE_TH_SPECIAL_B_END 0x0026
#define UNICODE_TYPE_TH_SPECIAL_C_START 0x0028
#define UNICODE_TYPE_TH_SPECIAL_C_END 0x002A
#define UNICODE_TYPE_TH_SPECIAL_D_START 0x002D
#define UNICODE_TYPE_TH_SPECIAL_D_END 0x002D
#define UNICODE_TYPE_TH_SPECIAL_E_START 0x0040
#define UNICODE_TYPE_TH_SPECIAL_E_END 0x0040
#define UNICODE_TYPE_TH_SPECIAL_F_START 0x005B
#define UNICODE_TYPE_TH_SPECIAL_F_END 0x005B
#define UNICODE_TYPE_TH_SPECIAL_G_START 0x005D
#define UNICODE_TYPE_TH_SPECIAL_G_END 0x005D
#define UNICODE_TYPE_TH_SPECIAL_H_START 0x005E
#define UNICODE_TYPE_TH_SPECIAL_H_END 0x005F
#define UNICODE_TYPE_RU_CYRILLIC_START 0x0400
#define UNICODE_TYPE_RU_CYRILLIC_END 0x04FF
#define UNICODE_TYPE_EU_SPECIAL_A_START 0x005F // 언더바 '_'
#define UNICODE_TYPE_EU_SPECIAL_A_END 0x005F
#define UNICODE_TYPE_EU_SPECIAL_B_START 0x002D // 대쉬 '-'
#define UNICODE_TYPE_EU_SPECIAL_B_END 0x002D
#define UNICODE_TYPE_EU_SPECIAL_C_START 0x0040 // 골뱅이 '@'
#define UNICODE_TYPE_EU_SPECIAL_C_END 0x0040
#define UNICODE_TYPE_EU_SPECIAL_D_START 0x002E // 골뱅이 '.'
#define UNICODE_TYPE_EU_SPECIAL_D_END 0x002E
#define IS_IN_RANGE(nMin,nMax,nValue) (nMin <= nValue && nMax >= nValue)
enum STRING_CHECK_TYPE
{
CHECK_TYPE_ALL = 1,
CHECK_TYPE_NUMBER = (1<<1),
CHECK_TYPE_ENG = (1<<2),
CHECK_TYPE_HAN = (1<<3),
CHECK_TYPE_SPECIAL = (1<<4),
CHECK_TYPE_JPN = (1<<5),
CHECK_TYPE_CJK_UNIFIED = (1<<6),
CHECK_TYPE_CJK_COMP = (1<<7),
CHECK_TYPE_SG_SPECIAL = (1<<8),
CHECK_TYPE_SG_PASS_SPECIAL = (1<<9),
CHECK_TYPE_TH = (1<<10),
CHECK_TYPE_TH_SPECIAL = (1<<11),
CHECK_TYPE_RU = (1<<12),
CHECK_TYPE_EU = (1<<13),
};
#define ALLOW_STRING_DEFAULT_ENG CHECK_TYPE_ENG | CHECK_TYPE_NUMBER
#define ALLOW_STRING_DEFAULT_KO ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_HAN
#define ALLOW_STRING_DEFAULT_JP ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_SPECIAL | CHECK_TYPE_JPN | CHECK_TYPE_CJK_UNIFIED
#define ALLOW_STRING_CHARACTERNAME_ENG CHECK_TYPE_ENG
#define ALLOW_STRING_DEFAULT_CH ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_ALL
#define ALLOW_STRING_DEFAULT_TW ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_CJK_UNIFIED
#define ALLOW_STRING_LOGIN_SG ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_SG_SPECIAL
#define ALLOW_STRING_PASS_SG ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_SPECIAL | CHECK_TYPE_SG_PASS_SPECIAL
#define ALLOW_STRING_DEFAULT_SG ALLOW_STRING_DEFAULT_ENG
#define ALLOW_STRING_DEFAULT_TH ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_TH
#define ALLOW_STRING_LOGIN_TH ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_TH | CHECK_TYPE_TH_SPECIAL
#define ALLOW_STRING_DEFAULT_RU CHECK_TYPE_NUMBER | CHECK_TYPE_RU
#define ALLOW_STRING_DEFAULT_EU ALLOW_STRING_DEFAULT_ENG | CHECK_TYPE_EU
#if defined(_KR) || defined(_KRAZ)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_KO
#elif defined(_US)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_ENG
#elif defined(_JP)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_JP
#elif defined(_CH)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_CH
#elif defined(_TW)
//rlkt 2016
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_TW//ALLOW_STRING_DEFAULT_TW
#elif defined(_SG)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_SG
#elif defined(_TH)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_TH
#elif defined(_ID)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_ENG
#elif defined(_RU)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_RU
#elif defined(_EU)
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_EU
#else
#define ALLOW_STRING_DEFAULT ALLOW_STRING_DEFAULT_KO
#endif // _KO, _US, _JP, _CH, _TW
typedef struct MIN_MAX
{
wchar_t nMin, nMax;
MIN_MAX(wchar_t min, wchar_t max) : nMin(min), nMax(max) {};
MIN_MAX() : nMin(0), nMax(0) {};
}MIN_MAX;
typedef stdext::hash_multimap<STRING_CHECK_TYPE, MIN_MAX> HASH_MAP_ALLOW_STRING;
typedef stdext::hash_multimap<STRING_CHECK_TYPE, MIN_MAX>::const_iterator HASH_MAP_ALLOW_STRING_I;
class CDNCountryUnicodeSet
{
private:
HASH_MAP_ALLOW_STRING m_mapAllowString;
public:
CDNCountryUnicodeSet();
~CDNCountryUnicodeSet();
bool Check(const wchar_t* pChr, DWORD dwCheckType = ALLOW_STRING_DEFAULT);
private:
bool IsExist(wchar_t pChr, STRING_CHECK_TYPE eType);
};
extern CDNCountryUnicodeSet g_CountryUnicodeSet;