`

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;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics