• 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;//添加结束符
    } 





  • 相关阅读:
    《移动开发者周刊》第十一期
    2012安卓巴士开发者沙龙成都站大家抓紧报名
    23岁那年你正处在哪个状态?现在呢?
    《老罗Android开发视频教程》老罗来交国庆的答卷了
    程序员,你的一千万在哪里?
    《老罗Android开发视频教程》更新
    2012全球开发者大会项目投资一对一相亲会
    windows远程桌面
    [LeetCode] NQueens
    [LeetCode] Pascal's Triangle II
  • 原文地址:https://www.cnblogs.com/alan666/p/8311928.html
Copyright © 2020-2023  润新知