unicode gbk 转换函数

typedef unsigned short	WCHAR;

//字库信息结构体定义
//用来保存字库基本信息,地址,大小等
__packed typedef struct 
{
	u8 fontok;				//字库存在标志,0XAA,字库正常;其他,字库不存在
	u32 ugbkaddr; 			//unigbk的地址
	u32 ugbksize;			//unigbk的大小	 
	u32 f12addr;			//gbk12地址	
	u32 gbk12size;			//gbk12的大小	 
	u32 f16addr;			//gbk16地址
	u32 gkb16size;			//gbk16的大小	 
}_font_info;																   

_font_info ftinfo;	//字库信息结构体



WCHAR ff_convert (	/* Converted code, 0 means conversion error */
	WCHAR	src,	/* Character code to be converted */
	UINT	dir		/* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
)
{
	WCHAR t[2];
	WCHAR c;
	u32 i, li, hi;
	u16 n;			 
	u32 gbk2uni_offset=0;		  
						  
	if (src < 0x80)c = src;//ASCII,直接不用转换.
	else 
	{
 		if(dir)	//GBK 2 UNICODE
		{
			gbk2uni_offset=ftinfo.ugbksize/2;	 
		}else	//UNICODE 2 GBK  
		{   
			gbk2uni_offset=0;
		}
		//if(UK_FLAG)//存在 		    
		{
			/* Unicode to OEMCP */
			hi=ftinfo.ugbksize/2;//对半开.
			hi =hi / 4 - 1;
			li = 0;
			for (n = 16; n; n--)
			{
				i = li + (hi - li) / 2;	
				SPI_Flash_Read((u8*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出8个字节  
				if (src == t[0]) break;
				if (src > t[0])li = i;  
				else hi = i;    
			}
			c = n ? t[1] : 0;  
 		}
		//else c=0;
	}
	return c;
}		   
//unicode gbk 转换函数
//src:输入字符串
//dst:输出(uni2gbk时为gbk内码,gbk2uni时,为unicode字符串)
//mode:0,unicode到gbk转换;
//     1,gbk到unicode转换;
void unigbk_exchange(u8 *src,u8 *dst,u8 mode)
{
	u16 temp; 
	u8 buf[2];
	if(mode)//gbk 2 unicode
	{
		while(*src!=0)
		{
			if(*src<0X81)	//非汉字
			{
				temp=(u16)ff_convert((WCHAR)*src,1);
				src++;
			}else 			//汉字,占2个字节
			{
				buf[1]=*src++;
				buf[0]=*src++; 
				temp=(u16)ff_convert((WCHAR)*(u16*)buf,1); 
			}
			*dst++=hex2chr((temp>>12)&0X0F);
			*dst++=hex2chr((temp>>8)&0X0F);
			*dst++=hex2chr((temp>>4)&0X0F);
			*dst++=hex2chr(temp&0X0F);
		}
	}else	//unicode 2 gbk
	{ 
		while(*src!=0)
		{
			buf[1] = chr2hex(*src++)*16;
			buf[1]+= chr2hex(*src++);
			buf[0] = chr2hex(*src++)*16;
			buf[0]+= chr2hex(*src++);
 			temp=(u16)ff_convert((WCHAR)*(u16*)buf,0);
			if(temp<0X80)
			{
				*dst=temp;
				dst++;
			}
			else 
			{
				*(u16*)dst=swap16(temp);
				dst+=2;
			}
		} 
	}
	*dst=0;//添加结束符
} 





posted @ 2017-07-16 10:55  隔壁王叔叔a  阅读(1125)  评论(0编辑  收藏  举报