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

📄 hcodecnvt.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:


int
KSC2UniString(unsigned char *kscString, wchar_t *uniString)
{
	unsigned char *pStr;
	unsigned long i;
	int uniLen;

	for (pStr = kscString, i = 0, uniLen = 0; *pStr; pStr++, i++, uniLen++)
	{
		if (KSC2UniSyl(pStr, &uniString[i]) == true)
		{
			if (uniString[i] == 0x0000)
				uniString[i] = KSC2UNI_DEFAULT_CHAR;
		}
		else
			uniString[i] = KSC2UNI_DEFAULT_CHAR;

		if (*pStr & 0x80)
			pStr++;		
	}

	uniString[i] = 0x0000;

	return uniLen;
}

bool
hccKSC2Uni_BlockA8(unsigned short kscSyl, wchar_t *uniSyl)
{
	switch (kscSyl)
	{
	case 0xA8A1:
		*uniSyl = 0x00C6; return true;
	case 0xA8A2:
		*uniSyl = 0x00D0; return true;
	case 0xA8A4:
		*uniSyl = 0x0126; return true;
	case 0xA8A6:
		*uniSyl = 0x0132; return true;
	case 0xA8A8:
		*uniSyl = 0x013F; return true;
	case 0xA8A9:
		*uniSyl = 0x0141; return true;
	case 0xA8AA:
		*uniSyl = 0x00D8; return true;
	case 0xA8AC:
		*uniSyl = 0x00BA; return true;
	case 0xA8AD:
		*uniSyl = 0x00DE; return true;
	case 0xA8AE:
		*uniSyl = 0x0166; return true;
	case 0xA8AF:
		*uniSyl = 0x014A; return true;
	case 0xA8F6:
		*uniSyl = 0x00BD; return true;
	case 0xA8F7:
		*uniSyl = 0x2153; return true;
	case 0xA8F8:
		*uniSyl = 0x2154; return true;
	case 0xA8F9:
		*uniSyl = 0x00BC; return true;
	case 0xA8FA:
		*uniSyl = 0x00BE; return true;
	}

	if (kscSyl >= 0xA8FB && kscSyl <= 0xA8FE)
	{
		*uniSyl = kscSyl - 0xA8FB + 0x215B;
		return true;
	}

	if (kscSyl >= 0xA8B1 && kscSyl <= 0xA8CC)
	{
		*uniSyl = kscSyl - 0xA8B1 + 0x3260;
		return true;
	}

	if (kscSyl >= 0xA8CD && kscSyl <= 0xA8E6)
	{
		*uniSyl = kscSyl - 0xA8CD + 0x24D0;
		return true;
	}

	if (kscSyl >= 0xA8E7 && kscSyl <= 0xA8F5)
	{
		*uniSyl = kscSyl - 0xA8E7 + 0x2460;
		return true;
	}

	*uniSyl = KSC2UNI_DEFAULT_CHAR;
	return false;
}

bool
hccKSC2Uni_BlockA9(unsigned short kscSyl, wchar_t *uniSyl)
{

	switch (kscSyl)
	{
	case 0xA9A1:
		*uniSyl = 0x00E6; return true;
	case 0xA9A2:
		*uniSyl = 0x0111; return true;
	case 0xA9A3:
		*uniSyl = 0x00F0; return true;
	case 0xA9A4:
		*uniSyl = 0x0127; return true;
	case 0xA9A5:
		*uniSyl = 0x0131; return true;
	case 0xA9A6:
		*uniSyl = 0x0133; return true;
	case 0xA9A7:
		*uniSyl = 0x0138; return true;
	case 0xA9A8:
		*uniSyl = 0x0140; return true;
	case 0xA9A9:
		*uniSyl = 0x0142; return true;
	case 0xA9AA:
		*uniSyl = 0x00F8; return true;
	case 0xA9AC:
		*uniSyl = 0x00DF; return true;
	case 0xA9AD:
		*uniSyl = 0x00FE; return true;
	case 0xA9AE:
		*uniSyl = 0x0167; return true;
	case 0xA9AF:
		*uniSyl = 0x014B; return true;
	case 0xA9B0:
		*uniSyl = 0x0149; return true;
	case 0xA9FA:
		*uniSyl = 0x207F; return true;
	case 0xA9F6:
		*uniSyl = 0x00B9; return true;
	case 0xA9F7:
		*uniSyl = 0x00B2; return true;
	case 0xA9F8:
		*uniSyl = 0x00B3; return true;
	}

	if (kscSyl >= 0xA9B1 && kscSyl <= 0xA9CC)
	{
		*uniSyl = kscSyl - 0xA9B1 + 0x3200;
		return true;
	}

	if (kscSyl >= 0xA9CD && kscSyl <= 0xA9E6)
	{
		*uniSyl = kscSyl - 0xA9CD + 0x249C;
		return true;
	}

	if (kscSyl >= 0xA9E7 && kscSyl <= 0xA9F5)
	{
		*uniSyl = kscSyl - 0xA9E7 + 0x2474;
		return true;
	}

	if (kscSyl >= 0xA9FB && kscSyl <= 0xA9FE)
	{
		*uniSyl = kscSyl - 0xA9FB + 0x2081;
		return true;
	}

	*uniSyl = KSC2UNI_DEFAULT_CHAR;
	return false;
}


bool
hccKSC2Uni_BlockAAAB(unsigned short kscSyl, wchar_t *uniSyl)
{
	if (kscSyl >= 0xAAA1 && kscSyl <= 0xAAF3)
	{
		*uniSyl = kscSyl - 0xAAA1 + 0x3041;
		return true;
	}
	else if (kscSyl >= 0xABA1 && kscSyl <= 0xABF6)
	{
		*uniSyl = kscSyl - 0xABA1 + 0x30A1;
		return true;
	}

	*uniSyl = KSC2UNI_DEFAULT_CHAR;
	return false;
}

bool
hccKSC2Uni_BlockAC(unsigned short kscSyl, wchar_t *uniSyl)
{
	if (kscSyl == 0xACA7)
	{
		*uniSyl = 0x0401;
		return true;
	}
	else if (kscSyl == 0xACD7)
	{
		*uniSyl = 0x0451;
		return true;
	}
	else if (kscSyl >= 0xACA1 && kscSyl <= 0xACA6)
	{
		*uniSyl = kscSyl - 0xACA1 + 0x0410;
		return true;
	}
	else if (kscSyl >= 0xACA8 && kscSyl <= 0xACC1)
	{
		*uniSyl = kscSyl - 0xACA8 + 0x0416;
		return true;
	}
	else if (kscSyl >= 0xACD1 && kscSyl <= 0xACD6)
	{
		*uniSyl = kscSyl - 0xACD1 + 0x0430;
		return true;
	}
	else if (kscSyl >= 0xACD8 && kscSyl <= 0xACF1)
	{
		*uniSyl = kscSyl - 0xACD8 + 0x0436;
		return true;
	}

	*uniSyl = KSC2UNI_DEFAULT_CHAR;
	return false;
}

bool
hccKSC2Uni_BlockA1A2(unsigned short kscSyl, wchar_t *uniSyl)
{
	int idx;	
	unsigned short uiSyl;


	if (kscSyl >= 0xa1a1 && kscSyl <= 0xa1ff)
	{
		idx = kscSyl - 0xa1a0;
		if (idx >= NUMOF_KSC_A1 || idx < 0)
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}

		uiSyl = hctbl_KSC2UNI_BLOCK_A1[idx];
		if (uiSyl == 0xffff)
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}
		else
		{
			*uniSyl = uiSyl;
			return true;
		}
	}
	else if (kscSyl >= 0xa2a0 && kscSyl <= 0xa2ef)
	{
		idx = kscSyl - 0xa2a0;
		if (idx >= NUMOF_KSC_A2 || idx < 0)
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}
		uiSyl = hctbl_KSC2UNI_BLOCK_A2[idx];
		if (uiSyl == 0xffff)
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}
		else
		{
			*uniSyl = uiSyl;
			return true;
		}
	}

	*uniSyl = KSC2UNI_DEFAULT_CHAR;
	return false;			
}

bool
hccKSC2Uni_BlockA6(unsigned short kscSyl, wchar_t *uniSyl)
{
	int idx;
	unsigned short uiSyl;

	if (kscSyl >= 0xA6A0 && kscSyl <= 0xA6FF)
	{
		idx = kscSyl - 0xA6A0;
		if (idx < 0 || idx >= NUMOF_KSC_A6)
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}

		uiSyl = hctbl_KSC2UNI_BLOCK_A6[idx];

		if (uiSyl == 0xffff)
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}

		*uniSyl = uiSyl;
		return true;
	}

	*uniSyl = KSC2UNI_DEFAULT_CHAR;
	return false;
}

bool
hccKSC2Uni_BlockA7(unsigned short kscSyl, wchar_t *uniSyl)
{
	int idx;
	unsigned short uiSyl;

	if (kscSyl >= 0xA7A0 && kscSyl <= 0xA7FF)
	{
		idx = kscSyl - 0xA7A0;
		if (idx < 0 || idx >= NUMOF_KSC_A7)
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}

		uiSyl = hctbl_KSC2UNI_BLOCK_A7[idx];

		if (uiSyl == 0xffff)
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}

		*uniSyl = uiSyl;
		return true;
	}

	*uniSyl = KSC2UNI_DEFAULT_CHAR;
	return false;
}

bool
hccKSC2UniSyl(unsigned short kscSyl, wchar_t *uniSyl)
{
	structHSyl tgSyl;

	unsigned short uniCHO;
	unsigned short uniJUNG;
	unsigned short uniJONG;
	
	

		// KS C 5601 Block A1 - A2
	if (kscSyl >= 0xa1a0 && kscSyl <= 0xa2ff)
	{
		if (hccKSC2Uni_BlockA1A2(kscSyl, uniSyl) == false)		
		{
			return false;		
		}
		else 		
		{			
			return true;
		}
		
	}
		// KS C 5601: Block A3 [Full-width]
	else if (kscSyl >= 0xA3A0 && kscSyl <= 0xA3FE)
	{
		if (kscSyl == 0xA3FF)
			return false;
		*uniSyl = kscSyl - 0xA3A0 + 0x0020;
		return true;
	}
		// KS C 5601: Block A4 [JAMO-Syllable]
	else if (kscSyl >= 0xA4A0 && kscSyl <= 0xA4FF)
	{
		if (kscSyl == 0xA4A0 || kscSyl == 0xA4FF)
			return false;
		*uniSyl = kscSyl - 0xA4A1 + 0x3131;
		return true;
	}
			// KS C 5601: Block A5 [Roman/Greek]
	else if (kscSyl >= 0xA5A0 && kscSyl <= 0xA5FF)
	{
			// KS C 5601: Roman Alphabet - Number
		if (kscSyl >= 0xA5A1 && kscSyl <= 0xA5AA)
		{
			*uniSyl = kscSyl - 0xA5A1 + 0x2170;
			return true;
		}
			// KS C 5601: Roman Alphabet - Number
		else if (kscSyl >= 0xA5B0 && kscSyl <= 0xA5B9)
		{
			*uniSyl = kscSyl - 0xA5B0 + 0x2160;
			return true;
		}
			// KS C 5601: Basic Greek Alphabet
		else if (kscSyl >= 0xA5C1 && kscSyl <= 0xA5D1)
		{
			*uniSyl = kscSyl - 0xA5C1 + 0x0391;
			return true;
		}
		else if (kscSyl >= 0xA5D2 && kscSyl <= 0xA5D8)
		{
			*uniSyl = kscSyl - 0xA5D2 + 0x03A3;
			return true;
		}
		else if (kscSyl >= 0xA5E1 && kscSyl <= 0xA5F1)
		{
			*uniSyl = kscSyl - 0xA5E1 + 0x03B1;
			return true;
		}
		else if (kscSyl >= 0xA5F2 && kscSyl <= 0xA5F8)
		{
			*uniSyl = kscSyl - 0xA5F2 + 0x03C3;
			return true;
		}

		return false;
	}
		// Block A6
	else if (kscSyl >= 0xA6A0 && kscSyl <= 0xA6FF)
	{
		if (hccKSC2Uni_BlockA6(kscSyl, uniSyl) == true)
			return true;
		else
			return false;
	}
		// Block A7
	else if (kscSyl >= 0xA7A0 && kscSyl <= 0xA7FF)
	{
		if (hccKSC2Uni_BlockA7(kscSyl, uniSyl) == true)
			return true;
		else
			return false;
	}
		// Block A8
	else if (kscSyl >= 0xA8A0 && kscSyl <= 0xA8FF)
	{
		if (hccKSC2Uni_BlockA8(kscSyl, uniSyl) == true)
			return true;
		else
			return false;
	}
		// Block A9
	else if (kscSyl >= 0xA9A0 && kscSyl <= 0xA9FF)
	{
		if (hccKSC2Uni_BlockA9(kscSyl, uniSyl) == true)
			return true;
		else
			 return false;
	}
		// Block AA - AB
	else if (kscSyl >= 0xAAA0 && kscSyl <= 0xABFF)
	{
		if (hccKSC2Uni_BlockAAAB(kscSyl, uniSyl) == true)
			return true;
		else
			return false;
	}
		// Block AC
	else if (kscSyl >= 0xACA0 && kscSyl <= 0xACFF)
	{
		if (hccKSC2Uni_BlockAC(kscSyl, uniSyl) == true)
			return true;
		else
			return false;
	}


	// Check if KSC 5601: 2,350 Chars 

	if (kscSyl >= 0xB0A0 && kscSyl <= 0xC8FF)
	{

		// Check if Microsoft Unified Hangul

		if ( ((kscSyl & 0x00ff) <= 0x00A0) || ((kscSyl & 0x00ff) == 0x00ff))
		{
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}

		tgSyl.hCode = ConvertKS2TGSyl(kscSyl);
	
		if (tgSyl.hCode == HCTBL_NOT_FOUND)
		{			
			*uniSyl = KSC2UNI_DEFAULT_CHAR;
			return false;
		}		

		uniCHO = tgSyl.hPhoneme.hCho - 0x02;
		uniJUNG = hctbl_KSSM2UNI_JUNG[tgSyl.hPhoneme.hJung];
		uniJONG = hctbl_KSSM2UNI_JONG[tgSyl.hPhoneme.hJong];

		*uniSyl = 0xAC00 + (uniCHO * 588) + uniJUNG * 28 + uniJONG;	
		return true;
	}
	*uniSyl = KSC2UNI_DEFAULT_CHAR;
	return false;
		
}


bool
hccUni2KSCSyl(wchar_t uniSyl, unsigned char *kscSyl)
{
	unsigned short uniCHO;
	unsigned short uniJUNG;
	unsigned short uniJONG;
	unsigned short kssmCHO;
	unsigned short kssmJUNG;
	unsigned short kssmJONG;

	structHSyl hSyl;
	unsigned short uiSyl;

	// If [Hangul Compatibility Jamo]
	if (uniSyl >= 0x3131 && uniSyl <= 0x318E )
	{
		uiSyl = (uniSyl - 0x3131) + 0xA4A1;
		*kscSyl = uiSyl >> 8;
		*(kscSyl+1) = uiSyl & 0x00ff;
		*(kscSyl+2) = '\0';
		return true;
	}

	// Check if [Hangul]

	if (uniSyl < 0xAC00 || uniSyl > 0xD79F)
		return false;

	//uniCHO = ((uniSyl - 0xAC00) / (21 * 28) );
	uniCHO = ((uniSyl - 0xAC00) / 588 );
	//uniJUNG = ((uniSyl - 0xAC00) % (21 * 28)) / 28;
	uniJUNG = ((uniSyl - 0xAC00) % 588) / 28;
	uniJONG = (uniSyl - 0xAC00) % 28;

	kssmCHO = uniCHO + 0x0002;
	kssmJUNG = hctbl_UNI2KSSM_JUNG[uniJUNG];
	kssmJONG = hctbl_UNI2KSSM_JONG[uniJONG];

	
	HAN_COMBI(hSyl, kssmCHO, kssmJUNG, kssmJONG);

	uiSyl = ConvertTG2KSSyl(hSyl.hCode);
	if (uiSyl == HCTBL_NOT_FOUND)
		return false;	
	
	*kscSyl = uiSyl >> 8;
	*(kscSyl+1) = uiSyl & 0x00ff;
	*(kscSyl+2) = '\0';
	return true;
}


//***********************************************
//
// AU-System requests the following APIs
//
//***********************************************

int
KSCStrLenOfUni(wchar_t *uStr)
{
	int kscLen = 0;
	int i;

	unsigned short uiCHO;
	unsigned short uiJUNG;
	unsigned short uiJONG;
	unsigned short kssmCHO;
	unsigned short kssmJUNG;
	unsigned short kssmJONG;

	structHSyl hSyl;

	if (! uStr)
		return kscLen;

	for (i = 0; uStr[i] != 0x0000; i++)
	{
		//if (uStr[i] >= 0x0020 && uStr[i] <= 0x007e)
		if (uStr[i] >= 0x0001 && uStr[i] <= 0x007e)
			kscLen++;
		else if (uStr[i] >= 0xac00 && uStr[i] <= 0xd7a3)
		{
			uiCHO = (uStr[i] - 0xAC00) / 588;
			uiJUNG = ( (uStr[i] - 0xAC00) % 588 ) / 28;
			uiJONG = (uStr[i] - 0xAC00) % 28;

			kssmCHO = uiCHO + 0x0002;
			kssmJUNG = hctbl_UNI2KSSM_JUNG[uiJUNG];
			kssmJONG = hctbl_UNI2KSSM_JONG[uiJONG];
			HAN_COMBI(hSyl, kssmCHO, kssmJUNG, kssmJONG);

// Changed by AU-System
//			if (ConvertTG2KSSyl(hSyl.hCode == HCTBL_NOT_FOUND))
			if (ConvertTG2KSSyl((unsigned short)(hSyl.hCode == HCTBL_NOT_FOUND)))
				kscLen += 4;			
			else
				kscLen += 2;
		}
		else
			kscLen += 2;
	}

	return kscLen;
}

int
UniLenOfKSCStr(char *kStr)
{
	int uniLen = 0;
	int i;

	if (! kStr)
		return uniLen;

	for (i = 0, uniLen = 0; kStr[i] != '\0'; i++, uniLen++)
	{
		if (kStr[i] & 0x80)
			i++;
	}

	return uniLen;
}

INT32
KSC2Unicode_calcLen(BYTE *str, BOOL isNullTerminated, UINT32 readBytes, UINT32 *strByteLen)
{
	int iLen;

	if (isNullTerminated == TRUE)
	{
		*strByteLen = (UINT32) strlen((char *) str);
		iLen = UniLenOfKSCStr((char *) str);
	}
	else
	{
		/* Removed by AU-System
		// In case that the 'str' does not terminate with the NULL character
		pStr = (char *) malloc(sizeof(char) * readBytes);
		memcpy(pStr, str, readBytes);
		pStr[readBytes] = '\0';
		iLen = UniLenOfKSCStr(pStr);
		free(pStr);
		*strByteLen = readBytes;
		pStr = NULL;

		Added by AU-System */
		UINT32 i;
		*strByteLen = readBytes;

		if (! str)
		{
			for (i = 0, iLen = 0; i < readBytes; i++, iLen++)
			{
				if (str[i] & 0x80)
					i++;
			}
		}
	}

	return iLen;
}

⌨️ 快捷键说明

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