菜鸟一枚,尤其是对linux,菜鸟都算不上,最近写个输入法,笨人笨办法还是有的,将所有汉字写到文本文件,然后读取出来就可以。由于是linux转码是必须的。下面一系列函数包含打开文件,读取关键字指定的一行数据,然后将每个gbk编码的汉字转成utf-8。 成品噢亲,但是有个问题,code_convert这个函数再使用的时候,有时会调用失败,不知道撒情况,所以搞个递归在那,调用失败继续调用,我看了下还是有失败,但是失败的频率变低咯。 目前先这样解决了,先忙手上的工作。
转码的函数抄自网上不清楚是谁的代码咯,这里表示感谢。
static int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,char *outbuf, size_t outlen)
{
int iRtn = 0;
iconv_t cd;
const char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -2;
memset(outbuf,0,outlen);
if (iconv(cd, const_cast<char**>(pin), &inlen,pout, &outlen)==-1)
{
iRtn = -1;
}
iconv_close(cd);
return iRtn;
}
/* UTF-8 to GB2312 */
static int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert(const_cast<char*>("UTF-8"),const_cast<char*>("GB2312"),inbuf,inlen,outbuf,outlen);
}
/* GB2312 to UTF-8 */
static int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert(const_cast<char*>("GB2312"), const_cast<char*>("UTF-8"), inbuf, inlen, outbuf, outlen);
}
//传递一个gbk编码的,找出拼音返回拼音的个数
static int GetPinyinNum(const char *inbuf,char *outbuf,size_t outlen)
{
for (int i = 0;i < 10;++i)
{
if(inbuf[i] >= 0 && inbuf[i] <= 127 && inbuf[i] != 61)
{
outbuf[i] = inbuf[i];
}
else
return i;
}
}
传递gbk编码字符串找汉字
static int GetHanziNum(const char* inbuf,char *outbuf,size_t outlen,int findIndex = 0)
{
int i = 0;
if(findIndex == 0 )
{
i = GetPinyinNum(inbuf,outbuf,outlen);
++i;
}
else
i = findIndex;
int iRtn = 0;
if(i < strlen(inbuf))
{
char *gbStr = new char[2];
gbStr[0] = inbuf[i++];
gbStr[1] = inbuf[i++];
iRtn = g2u(gbStr,strlen(gbStr),outbuf,outlen);
delete[] gbStr;
if (strlen(outbuf) > 3)
{
outbuf[3] = '\0';
}
if (iRtn < 0)
{
return iRtn;
}
else
{
return i; //表示当前已经转换到的索引
}
}
return 0; //0表示字符穿完了或者ASCII字符读完了
}
static int ReadFile(const char* szPinYin,char* textBuffer)
{
char buffer[256];
ifstream fin("hanzi_gb.txt",ios::in);
if(!fin)
{
printf("open file failed!");
return 0;
}
while(fin.getline(buffer,sizeof(buffer)))
{
char bufTmp[20];
strncpy(bufTmp,buffer,strlen(szPinYin));
bufTmp[strlen(szPinYin)] = '\0';
if (strcmp(bufTmp,szPinYin) == 0)
{
strcpy(textBuffer,buffer);
break;
}
}
fin.close();
return 0;
}
static int ReadHanzi(const char* szPinYin)
{
char *pbuffer = new char[256];
char *pbuffer1 = new char[256];
ReadFile(szPinYin,pbuffer);
cout<<pbuffer<<endl;
g2u(pbuffer,strlen(pbuffer),pbuffer1,100);
cout<< pbuffer1<<endl;
memset(pbuffer1,0,sizeof(pbuffer1));
int iPos = 0;
while((iPos = GetHanziNum(pbuffer,pbuffer1,100,0)) < 0);
while(iPos > 0 && iPos < strlen(pbuffer))
{
cout<<pbuffer1<<endl;
memset(pbuffer1,0,100);
iPos = GetHanziNum(pbuffer,pbuffer1,100,iPos);
}
delete[] pbuffer;
delete[] pbuffer1;
return 0;
}