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