unicode gbk 转换函数

来源:互联网 发布:数据库添加语句 编辑:程序博客网 时间:2024/04/20 07:37

typedef unsigned shortWCHAR;//字库信息结构体定义//用来保存字库基本信息,地址,大小等__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 */WCHARsrc,/* Character code to be converted */UINTdir/* 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;//添加结束符} 





原创粉丝点击