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

📄 convertcode.cpp

📁 对于通用的嵌入式系统字处理单元,本模块化程序可以快速实现常用汉字编码(GB2312,GB18030,BIG5码,Unicode码)的相互转换,无需库函数.从而实现使用单汉字字库显现多内码.具体参见re
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
		case 1:			/*  */
			u8DataH   = 0;
			u8DataL = pu8InputCode[0]	;
			u16InData = (U16)u8DataL;
			
			if(u8DataL > 0x7f)
			{
				* pu8OutputLen = 0;
				return INPUTCODE_ERROR;
			}		
			else
			{
				* pu8OutputLen = 1;
				pu8OutputCode[0] = u8DataL;
				return CONVERT_OK;
			}
			break;
		
		case 2:	
          	u8DataH = (pu8InputCode[0] & 0x1f) >> 2;
          	u8DataL = ((pu8InputCode[0] & 0x3) << 6) + (pu8InputCode[1] & 0x3f);
          	u16InData = (u8DataH << 8) + u8DataL;
          	break;
		
		case 3:
			u8DataH = ((pu8InputCode[0] & 0x0F) << 4) | ((pu8InputCode[1] >> 2) & 0x0F);
            u8DataL = ((pu8InputCode[1] & 0x03) << 6) + (pu8InputCode[2] & 0x3F);
           	u16InData = (u8DataH << 8) + u8DataL;
            break;
            
		default:
			* pu8OutputLen = 0;
			return INPUTLEN_ERROR;
	}	
	
	/* 读出转换表结果 */
	u16OutData = TB_UTF16_GB[u8DataH][u8DataL];
	
	/* 单字节以及无对应结果的情况判断 */
	if (u16OutData <= 0xff)
	{
		if ((u16OutData == 0)&&(u16InData != 0))
		{	/* 无对应结果 */
			* pu8OutputLen = 0;
			return CONVERT_ERROR;
		}
		else
		{	/* 单字节结果 */
			* pu8OutputLen = 1;
			pu8OutputCode[0] = (U8)u16OutData;
			return CONVERT_OK;
		}
	}

	/* 4字节的情况判断 ,在CJK统一汉字扩充A 3400-4DB5 */
	/* 但是,有80个字符,对应GB码位是0xFE50-FEA0。Unicode将其中52字收录到“CJK统一汉字扩充A”
	   所以,这80个字符需排除出 4字节的情况判断      
	*/
	if((u16InData >= 0x3400 )&&(u16InData <= 0x4db5)&&((u16OutData < 0xFE50 )||(u16OutData > 0xFEA0 )) )
	{
		u16SeekResult = SearchCodeTable(u16InData);
		if (u16SeekResult > 0)
		{
			* pu8OutputLen = 4;
			pu8OutputCode[0]  =  u16OutData >> 8;
			pu8OutputCode[1]  =  u16OutData & 0xff;
			pu8OutputCode[2]  =  u16SeekResult >> 8;
			pu8OutputCode[3]  =  u16SeekResult & 0xff;
			return CONVERT_OK;
		} 
		else
		{/* 无对应结果 */
			* pu8OutputLen = 0;
			return CONVERT_ERROR;
		}
	}

	/* 余下的为2字节的情况 */
	* pu8OutputLen = 2;
	pu8OutputCode[0]  =  u16OutData >> 8;
	pu8OutputCode[1]  =  u16OutData & 0xff;
	return CONVERT_OK;
	
}

#endif

#if (_BIG5_GB)
/***************************************************************************
*	函数名称:	Big5TOGb18030
*	作者	:		CZ
*	函数功能	:	将BIG5编码的字符转换为GB18030编码
*	接口描述:
*				
*		输入参数:
*				pu8InputCode - 输入的BIG5编码字符的存储地址
*				u8InputLen   - 输入的BIG5编码字符的长度
*				pu8OutputCode - 供存放输出的GB18030编码字符的首地址
*				pu8OutputLen  - 供存放输出的GB18030编码字符字节数的地址

*		返回参数:CONVERT_OK - 转换成功  CONVERT_ERROR - 转换失败  
*				 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
*		影响的参数:无
*						
*
*	补充说明:
*****************************************************************************/
S8 Big5TOGb18030(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen)
{
	U16 u16OutData;
	U8	u8DataH,u8DataL;

	/* 参数检查,默认需将u8InputLen置为2,即本函数只转换一个Big5汉字字符 */
	if(u8InputLen != 2)	
	{	/* 不是默认参数,如果是ASCII码,直接转换,否则报错 */
		if((u8InputLen == 1)&&(pu8InputCode[0] < 0x80))
		{
			* pu8OutputLen = 1;
			pu8OutputCode[0]  = pu8InputCode[0];
			return CONVERT_OK;
		}	
		/* 参数出错 */
		* pu8OutputLen = 0;
		return INPUTLEN_ERROR;
	}		
	
	/* 取得输入的BIG5数据,并分成高低位 */
	u8DataH	  = pu8InputCode[0];
	u8DataL   = pu8InputCode[1];
	
	/* big5码汉字的高字节必须大于0x80,判断之 */
	if( u8DataH < 0x81)
	{
		* pu8OutputLen = 0;
		return INPUTCODE_ERROR;
	}		

	/* 因为转换表是从0x8100开始的,所以需要调整u8DataH */
	u8DataH -= 0x81;
	
	/* 读出转换表结果 */
	u16OutData = TB_BIG5_GB[u8DataH][u8DataL];
	
	/* 单字节以及无对应结果的情况判断 */
	if (u16OutData <= 0xff)
	{
		if (u16OutData == 0)
		{	/* 无对应结果,这里可以排除输入为0导致结果为0的情况,因为u8DataH >= 0x81 */
			* pu8OutputLen = 0;
			return CONVERT_ERROR;
		}
		else
		{	/* 单字节结果 */
			* pu8OutputLen = 1;
			pu8OutputCode[0] = (U8)u16OutData;
			return CONVERT_OK;
		}
	}

	/* 4字节的情况判断:从实际结果发现,这是不可能发生的,所以省略此判断 */

	/* 余下的为2字节的情况 */
	* pu8OutputLen = 2;
	pu8OutputCode[0]  =  u16OutData >> 8;
	pu8OutputCode[1]  =  u16OutData & 0xff;
	return CONVERT_OK;

}
#endif

#if (_UTF16LE_BIG5 || _UTF16BE_BIG5)
/***************************************************************************
*	函数名称:	Utf16TOBig5
*	作者	:		CZ
*	函数功能	:	将Utf16编码的字符转换为GB18030编码
*	接口描述:
*				
*		输入参数:
*				pu16InputCode - 输入的Utf16编码字符的存储地址
*				pu8OutputCode - 供存放输出的BIG5编码字符的首地址
*				pu8OutputLen  - 供存放输出的BIG5编码字符字节数的地址

*		返回参数:CONVERT_OK - 转换成功  CONVERT_ERROR - 转换失败  
*				 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
*		影响的参数:无
*						
*
*	补充说明:
*****************************************************************************/
S8 Utf16TOBig5(U16* pu16InputCode, U8* pu8OutputCode, U8* pu8OutputLen)
{
	U16 u16InData,u16OutData;
	U8	u8DataH,u8DataL;
	
	
	/* 取得输入的UTF16数据,并分成高低位 */
	u16InData = *(pu16InputCode);
	u8DataH	  = u16InData >> 8;
	u8DataL   = u16InData & 0xff;
	
	/* 读出转换表结果 */
	u16OutData = TB_UTF16_BIG5[u8DataH][u8DataL];
	
	/* 单字节以及无对应结果的情况判断 */
	if (u16OutData <= 0xff)
	{
		if ((u16OutData == 0)&&(u16InData != 0))
		{	/* 无对应结果 */
			* pu8OutputLen = 0;
			return CONVERT_ERROR;
		}
		else
		{	/* 单字节结果 */
			* pu8OutputLen = 1;
			pu8OutputCode[0] = (U8)u16OutData;
			return CONVERT_OK;
		}
	}


	/* 余下的为2字节的情况 */
	* pu8OutputLen = 2;
	pu8OutputCode[0]  =  u16OutData >> 8;
	pu8OutputCode[1]  =  u16OutData & 0xff;
	return CONVERT_OK;


}
#endif

#if (_UTF8_BIG5)
/***************************************************************************
*	函数名称:	Utf8TOBig5
*	作者	:		CZ
*	函数功能	:	将Utf8编码的字符转换为BIG5编码
*	接口描述:
*				
*		输入参数:
*				pu8InputCode - 输入的Utf8编码字符的存储地址
*				u8InputLen   - 输入的Utf8编码字符的长度
*				pu8OutputCode - 供存放输出的BIG5编码字符的首地址
*				pu8OutputLen  - 供存放输出的BIG5编码字符字节数的地址

*		返回参数:CONVERT_OK - 转换成功  CONVERT_ERROR - 转换失败  
*				 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
*		影响的参数:无
*						
*
*	补充说明:
*****************************************************************************/
S8 Utf8TOBig5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen)
{
	U16 u16InData,u16OutData;
	U8	u8DataH,u8DataL;
	
	switch(u8InputLen)
	{
		case 1:			/*  */
			u8DataH   = 0;
			u8DataL = pu8InputCode[0]	;
			u16InData = (U16)u8DataL;
			
			if(u8DataL > 0x7f)
			{
				* pu8OutputLen = 0;
				return INPUTCODE_ERROR;
			}		
			else
			{ /* ACSII 码,转换结果即为本身 */
				* pu8OutputLen = 1;
				pu8OutputCode[0] = u8DataL;
				return CONVERT_OK;
			}
			break;
		
		case 2:	
          	u8DataH = (pu8InputCode[0] & 0x1f) >> 2;
          	u8DataL = ((pu8InputCode[0] & 0x3) << 6) + (pu8InputCode[1] & 0x3f);
          	u16InData = (u8DataH << 8) + u8DataL;
          	break;
		
		case 3:
			u8DataH = ((pu8InputCode[0] & 0x0F) << 4) | ((pu8InputCode[1] >> 2) & 0x0F);
            u8DataL = ((pu8InputCode[1] & 0x03) << 6) + (pu8InputCode[2] & 0x3F);
           	u16InData = (u8DataH << 8) + u8DataL;
            break;
            
		default:
			* pu8OutputLen = 0;
			return INPUTLEN_ERROR;
	}	
	
	/* 读出转换表结果 */
	u16OutData = TB_UTF16_BIG5[u8DataH][u8DataL];
	
	/* 单字节以及无对应结果的情况判断 */
	if (u16OutData <= 0xff)
	{
		if ((u16OutData == 0)&&(u16InData != 0))
		{	/* 无对应结果 */
			* pu8OutputLen = 0;
			return CONVERT_ERROR;
		}
		else
		{	/* 单字节结果 */
			* pu8OutputLen = 1;
			pu8OutputCode[0] = (U8)u16OutData;
			return CONVERT_OK;
		}
	}

	/* 余下的为2字节的情况 */
	* pu8OutputLen = 2;
	pu8OutputCode[0]  =  u16OutData >> 8;
	pu8OutputCode[1]  =  u16OutData & 0xff;
	return CONVERT_OK;
	
}
#endif

#if (_GB_BIG5)
/***************************************************************************
*	函数名称:	Gb18030TOBig5
*	作者	:		CZ
*	函数功能	:	将Utf8编码的字符转换为BIG5编码
*	接口描述:
*				
*		输入参数:
*				pu8InputCode - 输入的GB18030编码字符的存储地址
*				u8InputLen   - 输入的GB18030编码字符的长度
*				pu8OutputCode - 供存放输出的BIG5编码字符的首地址
*				pu8OutputLen  - 供存放输出的BIG5编码字符字节数的地址

*		返回参数:CONVERT_OK - 转换成功  CONVERT_ERROR - 转换失败  
*				 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
*		影响的参数:无
*						
*
*	补充说明:
*****************************************************************************/
S8 Gb18030TOBig5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen)
{
	U16 u16OutData;
	U8	u8DataH,u8DataL;

	/* 参数检查,如果是4字节GB18030代码,将无法转换,直接返回出错 */
	if(u8InputLen != 2)	
	{	/* 如果是ASCII码,直接转换 */
		if((u8InputLen == 1)&&(pu8InputCode[0] < 0x80))
		{
			* pu8OutputLen = 1;
			pu8OutputCode[0]  = pu8InputCode[0];
			return CONVERT_OK;
		}	
		/* 参数出错 */
		* pu8OutputLen = 0;
		return CONVERT_ERROR;
	}		
	
	/* 取得输入的GB数据,并分成高低位 */
	u8DataH	  = pu8InputCode[0];
	u8DataL   = pu8InputCode[1];
	
	/* GB码汉字的高字节必须大于0x80,判断之 */
	if( u8DataH < 0x81)
	{
		* pu8OutputLen = 0;
		return INPUTCODE_ERROR;
	}		

	/* 因为转换表是从0x8100开始的,所以需要调整u8DataH */
	u8DataH -= 0x81;
	
	/* 读出转换表结果 */
	u16OutData = TB_GB_BIG5[u8DataH][u8DataL];
	
	/* 单字节以及无对应结果的情况判断 */
	if (u16OutData <= 0xff)
	{
		if (u16OutData == 0)
		{	/* 无对应结果,这里可以排除输入为0导致结果为0的情况,因为u8DataH >= 0x81 */
			* pu8OutputLen = 0;
			return CONVERT_ERROR;
		}
		else
		{	/* 单字节结果 */
			* pu8OutputLen = 1;
			pu8OutputCode[0] = (U8)u16OutData;
			return CONVERT_OK;
		}
	}


	/* 余下的为2字节的情况 */
	* pu8OutputLen = 2;
	pu8OutputCode[0]  =  u16OutData >> 8;
	pu8OutputCode[1]  =  u16OutData & 0xff;
	return CONVERT_OK;

}
#endif

⌨️ 快捷键说明

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