⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcodecnvt.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//************************************************************************
//
// * File Name: HCodeCnvt.cpp
//
// Hangul Code Conversion: Another Solution
// 
// Date. 199. 7. 12.
// Contact Info.
//         Choi, Woonho. at Parole Science, Inc.
//         e-mail: whchoi@clepsi.co.kr
//         http://www.clepsi.co.kr
//         TEL : +82-2-887-8064
//         FAX : +82-2-888-6954
//
//


#include "HCodeCnvt.h"
#include "HCodeTable.h"
#include "HCodeDef.h"


#define	KSC2UNI_DEFAULT_CHAR	(0x0020)

//------------------------------------------------
//
//  Hangul Union Structure for KSSM CHO-JUNG-JONG
//
// * Hangul CHO-JUNG-JONG Bitfield Structure
//------------------------------------------------

typedef union _hSyl_
{
	unsigned short hCode;
	struct
	{
		unsigned int hJong:	5;
		unsigned int hJung:	5;
		unsigned int hCho :	5;
		unsigned int hFlag:	1;
	} hPhoneme;
} structHSyl;

/////////////////////////////////////////////////
// Hangul Combination Macro using Bit-Field
/////////////////////////////////////////////////

#define HAN_COMBI(hStruct, i, m, f) ( (hStruct).hPhoneme.hFlag = 1, (hStruct).hPhoneme.hCho = (i), (hStruct).hPhoneme.hJung = (m), (hStruct).hPhoneme.hJong = (f), (hStruct).hCode)

/////////////////////////////////////////////////


unsigned short
searchKSTable(unsigned short uiTGCode)
{
	unsigned short iStart = 0;
	unsigned short iEnd = NUMOF_KSCODE_HANGUL;
	unsigned short iMid;


	while (1)
	{
		iMid = ((iEnd - iStart) >> 1) + iStart;
		if (hctbl_KSCode[iMid] == uiTGCode)
			return iMid;

		if (iEnd <= iStart)		// Hangul Syllable not found in 'hctbl_KSCode' Table
			return HCTBL_NOT_FOUND;
		else if (hctbl_KSCode[iMid] > uiTGCode)
			iEnd = iMid - 1;
		else
			iStart = iMid + 1;
	}

	return HCTBL_NOT_FOUND;
}


//===========================================================
// Combination Code to KS C-5601 1987
//
// Return Value
// - KS C-5601 Code Value (if found in table)
// - HCTBL_NOT_FOUND (if not in KS C-5601 1987, 2350 Chars)
//==========================================================

unsigned short
ConvertTG2KSSyl(unsigned short uiTG)
{

	unsigned short uiIdx;

	uiIdx = searchKSTable(uiTG);

	if (uiIdx != HCTBL_NOT_FOUND)
	{		
		return ( (((uiIdx/94) + 0xB0) << 8) + (uiIdx % 94) + 0xA1);
	}

	// Syllable not found in the range of 2,350 Char(s). KS C-5601 1987
	
	return HCTBL_NOT_FOUND;
}

unsigned short
ConvertKS2TGSyl(unsigned short uiKS)
{
	short c1;
	short c2;
	short idx;

	c1 = uiKS >> 8;
	c2 = uiKS & 0x00ff;

		// Get Array Index from Table ROW-COLUMN Index
	idx = (c1 - 0x00B0) * 94 + (c2 - 0x00A1);

	if (idx < 0 || idx > NUMOF_KSCODE_HANGUL)
		return HCTBL_NOT_FOUND;

	return (hctbl_KSCode[idx]);
}

//
// CJK Compatible - Converting
bool
hccUni2KSC_CJKCompatible(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;

	if (uniSyl >= 0x3380 && uniSyl <= 0x3384)
		uiSyl = uniSyl - 0x3380 + 0xA7C9;
	else if (uniSyl == 0x3388 || uniSyl == 0x3389)
		uiSyl = uniSyl - 0x3388 + 0xA7BA;
	else if (uniSyl >= 0x338A && uniSyl <= 0x338C)
		uiSyl = uniSyl - 0x338A + 0xA7DC;
	else if (uniSyl >= 0x338D && uniSyl <= 0x338F)
		uiSyl = uniSyl - 0x338D + 0xA7B6;
	else if (uniSyl >= 0x3390 && uniSyl <= 0x3394)
		uiSyl = uniSyl - 0x3390 + 0xA7D4;
	else if (uniSyl >= 0x3395 && uniSyl <= 0x3398)
	{
		uiSyl = uniSyl - 0x3395;
		switch (uniSyl)
		{
		case 0x3395:
		case 0x3396:
		case 0x3397:
			uiSyl += 0xA7A1; break;
		case 0x3398:
			uiSyl = 0xA7A5; break;
		}
	}
	else if (uniSyl >= 0x3399 && uniSyl <= 0x33A2)
		uiSyl = uniSyl - 0x3399 + 0xA7AB;
	else if (uniSyl >= 0x33A3 && uniSyl <= 0x33A6)
		uiSyl = uniSyl - 0x33A3 + 0xA7A7;
	else if (uniSyl == 0x33A7 || uniSyl == 0x33A8)
		uiSyl = uniSyl - 0x33A7 + 0xA7BD;
	else if (uniSyl >= 0x33A9 && uniSyl <= 0x33AC)
		uiSyl = uniSyl - 0x33A9 + 0xA7E5;
	else if (uniSyl >= 0x33AD && uniSyl <= 0x33AF)
		uiSyl = uniSyl - 0x33AD + 0xA7E1;
	else if (uniSyl >= 0x33B0 && uniSyl <= 0x33B9)
		uiSyl = uniSyl - 0x33B0 + 0xA7BF;
	else if (uniSyl >= 0x33BA && uniSyl <= 0x33BF)
		uiSyl = uniSyl - 0x33BA + 0xA7CE;
	else if (uniSyl == 0x33C0 || uniSyl == 0x33C1)
		uiSyl = uniSyl - 0x33C0 + 0xA7DA;
	else if (uniSyl >= 0x33C2 && uniSyl <= 0x33FF)
	{
		switch (uniSyl)
		{
		case 0x33C2: uiSyl = 0xA2E3; break;
		case 0x33C3: uiSyl = 0xA7EC; break;
		case 0x33C4: uiSyl = 0xA7A6; break;
		case 0x33C5: uiSyl = 0xA7E0; break;
		case 0x33C6: uiSyl = 0xA7EF; break;
		case 0x33C7: uiSyl = 0xA2E1; break;
		case 0x33C8: uiSyl = 0xA7BC; break;
		case 0x33C9: uiSyl = 0xA7ED; break;
		case 0x33CA: uiSyl = 0xA7B5; break;
		case 0x33CF: uiSyl = 0xA7B9; break;
		case 0x33D0: uiSyl = 0xA7EA; break;
		case 0x33D3: uiSyl = 0xA7EB; break;
		case 0x33D6: uiSyl = 0xA7DF; break;
		case 0x33D8: uiSyl = 0xA2E4; break;
		case 0x33DB: uiSyl = 0xA7E4; break;
		case 0x33DC: uiSyl = 0xA7EE; break;
		case 0x33DD: uiSyl = 0xA7E9; break;
		default: return false;
		}
	}

	*kscSyl = uiSyl >> 8;
	*(kscSyl+1) = uiSyl & 0x00ff;
	*(kscSyl+2) = '\0';
	return true;
}

bool
hccUni2KSCJapanese(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;

	// Hiragana
	if (uniSyl >= 0x3041 && uniSyl <= 0x3093)
	{
		uiSyl = (uniSyl - 0x3041) + 0xAAA1;
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}
		// Katakana
	if (uniSyl >= 0x30A1 && uniSyl <= 0x30F6)
	{
		uiSyl = (uniSyl - 0x30A1) + 0xABA1;
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}

	return false;
}

bool
hccUni2KSC_BoxDrawing(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;
	short uiIdx;

	uiIdx = uniSyl - 0x2500;

	if (uiIdx < 0 || uiIdx > NUMOF_BOXDRAW - 1)
		return false;

	uiSyl = hctbl_UNI2KSC_BOXDRAW[uiIdx];

	if (uiSyl == 0xffff)
		return false;

	*kscSyl = uiSyl >> 8;
	*(kscSyl+1) = uiSyl & 0x00ff;
	*(kscSyl+2) = '\0';
	return true;
}

bool
hccUni2KSC_MathOperator(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;
	bool bTranslated = false;

	if (uniSyl < 0x2200 || uniSyl > 0x22FF)
		return false;
	
	switch (uniSyl)
	{
				// Unicode [Mathematical Operators]
	case 0x2200:		// Quantifier All
		uiSyl = 0xA2A3; bTranslated = true; break;
	case 0x2202:
		uiSyl = 0xA1D3; bTranslated = true; break;
	case 0x2203:
		uiSyl = 0xA2A4; bTranslated = true; break;
	case 0x2207:
		uiSyl = 0xA1D4; bTranslated = true; break;
	case 0x2208:
		uiSyl = 0xA1F4; bTranslated = true; break;
	case 0x220B:
		uiSyl = 0xA1F5; bTranslated = true; break;
	case 0x220F:
		uiSyl = 0xA2B3; bTranslated = true; break;
	case 0x2211:
		uiSyl = 0xA2B2; bTranslated = true; break;
	case 0x221A:
		uiSyl = 0xA1EE; bTranslated = true; break;
	case 0x221D:
		uiSyl = 0xA1F0; bTranslated = true; break;
	case 0x221E:
		uiSyl = 0xA1C4; bTranslated = true; break;
	case 0x2220:
		uiSyl = 0xA1D0; bTranslated = true; break;
	case 0x2225:
		uiSyl = 0xA1AB; bTranslated = true; break;
	case 0x2227:
		uiSyl = 0xA1FC; bTranslated = true; break;
	case 0x2228:
		uiSyl = 0xA1FD; bTranslated = true; break;
	case 0x2229:
		uiSyl = 0xA1FB; bTranslated = true; break;
	case 0x222A:
		uiSyl = 0xA1FA; bTranslated = true; break;
	case 0x222B:
		uiSyl = 0xA1F2; bTranslated = true; break;
	case 0x222C:
		uiSyl = 0xA1F3; bTranslated = true; break;
	case 0x222E:
		uiSyl = 0xA2B1; bTranslated = true; break;
	case 0x2234:
		uiSyl = 0xA1C5; bTranslated = true; break;
	case 0x2235:
		uiSyl = 0xA1F1; bTranslated = true; break;
	case 0x223C:
		uiSyl = 0xA1AD; bTranslated = true; break;
	case 0x223D:
		uiSyl = 0xA1EF; bTranslated = true; break;
	case 0x2252:
		uiSyl = 0xA1D6; bTranslated = true; break;
	case 0x2260:
		uiSyl = 0xA1C1; bTranslated = true; break;
	case 0x2261:
		uiSyl = 0xA1D5; bTranslated = true; break;
	case 0x2264:
		uiSyl = 0xA1C2; bTranslated = true; break;
	case 0x2265:
		uiSyl = 0xA1C3; bTranslated = true; break;
	case 0x226A:
		uiSyl = 0xA1EC; bTranslated = true; break;
	case 0x226B:
		uiSyl = 0xA1ED; bTranslated = true; break;
	case 0x2282:
		uiSyl = 0xA1F8; bTranslated = true; break;
	case 0x2283:
		uiSyl = 0xA1F9; bTranslated = true; break;
	case 0x2286:
		uiSyl = 0xA1F6; bTranslated = true; break;
	case 0x2287:
		uiSyl = 0xA1F7; bTranslated = true; break;
	case 0x2299:
		uiSyl = 0xA2C1; bTranslated = true; break;
	case 0x22A5:
		uiSyl = 0xA1D1; bTranslated = true; break;
	default:
		bTranslated = false; break;
	}

	if (bTranslated == true)
	{
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}

	return false;

}

bool
hccUni2KSC_EnclosedAlphaNumerics(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;
	bool bTranslated= false;

	//Range 0x2460 - 0x24ff

	if (uniSyl < 0x2460 || uniSyl > 0x24ff)
		return false;

	if (uniSyl >= 0x2460 && uniSyl <= 0x246E)
	{
		uiSyl = uniSyl - 0x2460 + 0xA8E7;
		bTranslated = true;
	}
	else if (uniSyl >= 0x2474 && uniSyl <= 0x2482)
	{
		uiSyl = uniSyl - 0x2474 + 0xA9E7;
		bTranslated = true;
	}
	else if (uniSyl >= 0x249C && uniSyl <= 0x24B5)
	{
		uiSyl = uniSyl - 0x249C + 0xA9CD;
		bTranslated = true;
	}
	else if (uniSyl >= 0x24D0 && uniSyl <= 0x24E9)
	{
		uiSyl = uniSyl - 0x24D0 + 0xA8CD;
		bTranslated = true;
	}

	if (bTranslated == true)
	{
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}

	return false;
}

bool 
hccUni2KSC_GeometricShapes(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;
	bool bTranslated = false;

	if (uniSyl < 0x25a0 || uniSyl > 0x25ff)
		return false;

	switch (uniSyl)
	{
	case 0x25A0: 
		uiSyl = 0xA1E1; bTranslated = true; break;
	case 0x25A1:
		uiSyl = 0xA1E0; bTranslated = true; break;
	case 0x25A3:
		uiSyl = 0xA2C3; bTranslated = true; break;
	case 0x25A4:
		uiSyl = 0xA2C7; bTranslated = true; break;
	case 0x25A5:
		uiSyl = 0xA2C8; bTranslated = true; break;
	case 0x25A6:
		uiSyl = 0xA2CB; bTranslated = true; break;
	case 0x25A7:
		uiSyl = 0xA2CA; bTranslated = true; break;
	case 0x25A8:
		uiSyl = 0xA2C9; bTranslated = true; break;
	case 0x25A9:
		uiSyl = 0xA2CC; bTranslated = true; break;
	case 0x25B2:
		uiSyl = 0xA1E3; bTranslated = true; break;
	case 0x25B3:
		uiSyl = 0xA1E2; bTranslated = true; break;
	case 0x25B6:
		uiSyl = 0xA2BA; bTranslated = true; break;
	case 0x25B7:
		uiSyl = 0xA2B9; bTranslated = true; break;
	case 0x25BC:
		uiSyl = 0xA1E5; bTranslated = true; break;
	case 0x25BD:
		uiSyl = 0xA1E4; bTranslated = true; break;
	case 0x25C0:
		uiSyl = 0xA2B8; bTranslated = true; break;
	case 0x25C1:
		uiSyl = 0xA2B7; bTranslated = true; break;
	case 0x25C6:
		uiSyl = 0xA1DF; bTranslated = true; break;
	case 0x25C7:
		uiSyl = 0xA1DE; bTranslated = true; break;
	case 0x25C8:
		uiSyl = 0xA2C2; bTranslated = true; break;
	case 0x25CB:
		uiSyl = 0xA1DB; bTranslated = true; break;
	case 0x25CE:
		uiSyl = 0xA1DD; bTranslated = true; break;
	case 0x25CF:
		uiSyl = 0xA1DC; bTranslated = true; break;
	case 0x25D0:
		uiSyl = 0xA2C4; bTranslated = true; break;
	case 0x25D1:
		uiSyl = 0xA2C5; bTranslated = true; break;
	default: break;
	}

	if (bTranslated == true)
	{
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}

	return false;
}

bool 
hccUni2KSC_MiscDingbats(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;
	bool bTranslated = false;

	if (uniSyl < 0x2600 || uniSyl > 0x26ff)
		return false;

	switch (uniSyl)
	{
	case 0x2605:
		uiSyl = 0xA1DA; bTranslated = true; break;
	case 0x2606:
		uiSyl = 0xA1D9; bTranslated = true; break;
	case 0x260E:
		uiSyl = 0xA2CF; bTranslated = true; break;
	case 0x260F:
		uiSyl = 0xA2CE; bTranslated = true; break;
	case 0x261C:
		uiSyl = 0xA2D0; bTranslated = true; break;
	case 0x261E:
		uiSyl = 0xA2D1; bTranslated = true; break;
	case 0x2640:
		uiSyl = 0xA1CF; bTranslated = true; break;
	case 0x2642:
		uiSyl = 0xA1CE; bTranslated = true; break;
	case 0x2660:
		uiSyl = 0xA2BC; bTranslated = true; break;
	case 0x2661:
		uiSyl = 0xA2BD; bTranslated = true; break;
	case 0x2663:
		uiSyl = 0xA2C0; bTranslated = true; break;
	case 0x2664:
		uiSyl = 0xA2BB; bTranslated = true; break;
	case 0x2665:
		uiSyl = 0xA2BE; bTranslated = true; break;
	case 0x2667:
		uiSyl = 0xA2BF; bTranslated = true; break;
	case 0x2668:
		uiSyl = 0xA2CD; bTranslated = true; break;
	case 0x2669:
		uiSyl = 0xA2DB; bTranslated = true; break;
	case 0x266A:
		uiSyl = 0xA2DC; bTranslated = true; break;
	case 0x266C:
		uiSyl = 0xA2DD; bTranslated = true; break;
	case 0x266D:
		uiSyl = 0xA2DA; bTranslated = true; break;
	default: break;
	}

	if (bTranslated == true)
	{
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}

	return false;
}

bool 
hccUni2KSC_CJKSymPunc(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;
	bool bTranslated = false;

	if (uniSyl < 0x3000 || uniSyl > 0x303F)
		return false;

	switch (uniSyl)
	{
	case 0x3001:
		uiSyl = 0xA1A2; bTranslated = true; break;
	case 0x3002:
		uiSyl = 0xA1C6; bTranslated = true; break;
	case 0x3003:
		uiSyl = 0xA1C8; bTranslated = true; break;
	case 0x3008:
		uiSyl = 0xA1B4; bTranslated = true; break;
	case 0x3009:
		uiSyl = 0xA1B5; bTranslated = true; break;
	case 0x300A:
		uiSyl = 0xA1B6; bTranslated = true; break;
	case 0x300B:
		uiSyl = 0xA1B7; bTranslated = true; break;
	case 0x300C:
		uiSyl = 0xA1B8; bTranslated = true; break;
	case 0x300D:
		uiSyl = 0xA1B9; bTranslated = true; break;
	case 0x300E:
		uiSyl = 0xA1BA; bTranslated = true; break;
	case 0x300F:
		uiSyl = 0xA1BB; bTranslated = true; break;
	case 0x3010:
		uiSyl = 0xA1BC; bTranslated = true; break;
	case 0x3011:
		uiSyl = 0xA1BD; bTranslated = true; break;
	case 0x3013:
		uiSyl = 0xA1EB; bTranslated = true; break;
	case 0x3014:
		uiSyl = 0xA1B2; bTranslated = true; break;
	case 0x3015:
		uiSyl = 0xA1B3; bTranslated = true; break;
	default: break;
	}

	if (bTranslated == true)
	{
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}

	return false;
}

bool 
hccUni2KSC_EnclosedCJKLetters(wchar_t uniSyl, unsigned char *kscSyl)
{

	unsigned short uiSyl;
	bool bTranslated = false;

	// 0x3200 - 0x32ff

	if (uniSyl < 0x3200 || uniSyl > 0x32FF)
		return false;

	if (uniSyl >= 0x3200 && uniSyl <= 0x321B)
	{
		uiSyl = uniSyl - 0x3200 + 0xA9B1;
		bTranslated = true;
	}
	else if (uniSyl >= 0x3260 && uniSyl <= 0x327B)
	{
		uiSyl = uniSyl - 0x3260 + 0xA8B1;
		bTranslated = true;
	}
	else if (uniSyl == 0x321C)
	{
		uiSyl = 0xA2DF;
		bTranslated = true;
	}
	else if (uniSyl == 0x327F)
	{
		uiSyl = 0xA2DE;
		bTranslated = true;
	}

	if (bTranslated == true)
	{
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}

	return false;
}

bool 
hccUni2KSC_HalfFullForms(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uiSyl;
	bool bTranslated = true;

	if (uniSyl < 0xff00 || uniSyl > 0x00ef)
		return false;

	if (uniSyl >= 0xFF00 && uniSyl <= 0xFF5D)
	{
		uiSyl = uniSyl - 0xFF00 + 0xA3A0;
		bTranslated = true;
	}
	else
	{
		switch (uniSyl)
		{
		case 0xFF5E:
			uiSyl = 0xA1AD; bTranslated = true; break;
		case 0xFFE0:
			uiSyl = 0xA1CB; bTranslated = true; break;
		case 0xFFE1:
			uiSyl = 0xA1CC; bTranslated = true; break;
		case 0xFFE2:
			uiSyl = 0xA1FE; bTranslated = true; break;
		case 0xFFE3:
			uiSyl = 0xA3FE; bTranslated = true; break;
		case 0xFFE5:
			uiSyl = 0xA1CD; bTranslated = true; break;
		case 0xFFE6:
			uiSyl = 0xA1DC; bTranslated = true; break;
		default: break;
		}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -