EVC上读取UNICODE 文本

      近来做的一个项目要做多语言,采用了把语言写到一个文件中的做法,这个文件要用unicode编码保存,等程序启动时,再从unicode文本中读取语言,刚开始在读取文本的时候用fgetws()来读取一行,没想到在EVC上可晕了,读出来的中间都多了1个0,后来就自己封装了个函数来读取一行文本:

 

#define MAX_TEXT_ITEM 256//共有的文字条目数
#define TEXT_ID_LENGTH 5//文字ID字符数
#define ONE_ITEM_LENGTH 32//每个字符串占得最大字符数

enum LANG_ID
{
 LANG_KOR=0,
 LANG_ENG=1,
 LANG_CHS=2
};

enum GET_TEXT_RESULT
{
 GET_TEXT_OK=0,//获取字符串OK
 GET_TEXT_NOT_EXIST=1,//字符串ID不存在
 GET_TEXT_ALREADY_CLOSE=2//该文件已经被关闭
};

TCHAR* textBuffer = NULL;

int textNum=0;

TCHAR* get_Line(TCHAR* pSrcBuffer, TCHAR* pDstBuffer, int iDstLen)
{
 //读取一行数据
 TCHAR* pData;
 int iLen;
 if(*pSrcBuffer==0 || iDstLen <=0) return NULL;
 while(*pSrcBuffer==0x000d || *pSrcBuffer==0x000a)
  pSrcBuffer++;
 pData = pSrcBuffer;
 while(*pData!=0x000d && *pData!=0x000a)
  pData++;//直到换行或回车
 iLen = (pData-pSrcBuffer)*sizeof(TCHAR);
 if(iLen<=0) return NULL;
 if(iDstLen<iLen) iLen = iDstLen;
 memcpy(pDstBuffer,pSrcBuffer,iLen);
 return pData;
}

//传入参数分别为语言ID,程序ID为整形,如程序ID为01,传参数为1
BOOL InitLang(LANG_ID id,int progId/*TCHAR* progId*/)
{
 BOOL find = FALSE;
 TCHAR tmp[48]={0};
 TCHAR* file;
 TCHAR pID[20];
 int i, index;

 FILE* fp;
 int iFileLen;
 int iReadLen;
 char *pFileBuffer;
 unsigned short *pData;

 //申请存放文字ID和文字内容的内存
 textBuffer = (TCHAR*)malloc(MAX_TEXT_ITEM*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)*sizeof(TCHAR));
 if(textBuffer == NULL)
  return FALSE;

 memset(textBuffer,0,MAX_TEXT_ITEM*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)*sizeof(TCHAR));

 if(LANG_CHS == id)
 {
  file = _T("//Windows//ebk_lang_chs.txt");
 }
 else if(LANG_ENG == id)
 {
  file = _T("//Windows//ebk_lang_eng.txt");
 }
 else if(LANG_KOR == id)
 {
  file = _T("//Windows//ebk_lang_kor.txt");
 }

 wcscpy(pID,_T("[progID]="));
 TCHAR buf[20];
 if(progId < 10)
 {
  wsprintf(buf,_T("0%d"),progId);
 }
 else
 {
  wsprintf(buf,_T("%d"),progId);
 }
 
 wcscat(pID,buf);

 fp = _wfopen(file,_T("r"));

 if(fp == NULL)
 {
  RETAILMSG(1, (TEXT(" File of %s is not exist!/r/n"),file));
  return FALSE;
 }

 fseek(fp, 0, SEEK_END);
 iFileLen = ftell(fp);
 if(iFileLen <= 0)
 {
  fclose(fp);
  return FALSE;
 } 
 pFileBuffer = (char*)malloc(iFileLen);
 if(pFileBuffer == NULL)
 {
  fclose(fp);
  return FALSE;
 } 
 fseek(fp, 0, SEEK_SET);
 iReadLen = fread(pFileBuffer, 1, iFileLen, fp);
 if(iReadLen < iFileLen)
 {
  free(pFileBuffer);
  fclose(fp);
  return FALSE;
 } 
 
 fclose(fp);
 
 pData = (unsigned short *)pFileBuffer;
 if(*pData==0xfeff) pData++;//忽略零宽度不换行的空格
 

 while(pData = get_Line(pData,tmp,48*sizeof(TCHAR)))
 {
  //根据程序ID查找到相应的段
  if(0 == wcsncmp(tmp,pID,wcslen(pID)))
  {
   find = TRUE;
   break;
  }
 }
 
 //查找到相应段后开始读文字ID和文字内容
 while(pData = get_Line(pData,tmp,48*sizeof(TCHAR)))
 {
  if(tmp[0] == _T('<'))
  {
   index=0;

   //读取文字ID
   for(i=1; i<TEXT_ID_LENGTH+1;i++)
   {
    textBuffer[textNum*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH) + index++] = tmp[i];
   }

   //读取文字内容
   index=0;
   for(i+=3;i<wcslen(tmp);i++)
   {
    if(tmp[i] != _T('"'))
    {
     textBuffer[textNum*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+TEXT_ID_LENGTH + index++] = tmp[i];
    }
    else
     break;   
   }
    
   textBuffer[textNum*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+TEXT_ID_LENGTH + index] = _T('/0');
   textNum++;
  }
  else
   break;
 }

 free(pFileBuffer);

 if( find && textNum)
  return TRUE;
 
 return FALSE;
}

//根据字符串ID获取字符串,第1个参数为字符串ID,不包括程序ID,如在文件中是<02005>,传字符串ID为5,data为存放内容的内存。
GET_TEXT_RESULT getTextItem(/*TCHAR* ID*/int ID, TCHAR* data)
{
 if(textBuffer == NULL)
 {
  return GET_TEXT_ALREADY_CLOSE;
 }

 TCHAR tmpId[4];
 int index=0;
 int i,j;
 TCHAR buf[20];

 if(ID < 10)
 {
  wsprintf(buf,_T("00%d"),ID);
 }
 else if(ID < 100)
 {
  wsprintf(buf,_T("0%d"),ID);
 }
 else if(ID < 1000)
 {
  wsprintf(buf,_T("%d"),ID);
 }
 
 for(i=0;i<=textNum;i++)
 {
  //从内存中取出ID号,仅取ID号中后3位
  for(j=0;j<3;j++)
  {
   tmpId[j] = textBuffer[i*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+2+j];
  }
  tmpId[j] = _T('/0');

  if(0 == wcscmp(tmpId,buf))
  {
   //取所需ID号对应的文字,最多取32个
   for(j=0;j<ONE_ITEM_LENGTH;j++)
   {
    if(textBuffer[i*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+TEXT_ID_LENGTH+j] != _T('/0'))
    {
     data[index++] = textBuffer[i*(TEXT_ID_LENGTH+ONE_ITEM_LENGTH)+TEXT_ID_LENGTH+j];
    }
    else
     break;
   }
   data[index] = _T('/0');
   return GET_TEXT_OK;
  }
 }

 return GET_TEXT_NOT_EXIST;
}

//释放内存
void closeText()
{
 textNum = 0;
 free(textBuffer);
 textBuffer = NULL;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值