linux读取文本文件 GBK转utf-8

菜鸟一枚,尤其是对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; 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值