急急!!iconv转换问题

时间:2021-03-03 08:44:21
从文本文件中用fgets以行尾单位读于中文字符串(测试的时候带英文):存储到*char_menu[max_line];中

for(i=0;i<max_line;i++)
gbktoutf8(char_menu[i]) ;
int gbktoutf8(char *pch)   
  {   int len,i;
      char *dest;
  dest=new char[OUTLEN];
AstDebug("%d,%s\n",strlen(pch),pch);
for(i=0;i<strlen(pch);i++)
{
       AstDebug("%x\n",pch[i]);
}
g2u(pch,strlen(pch),dest, OUTLEN);  
//g2u(aaa,strlen(pch),dest, OUTLEN);  
       sprintf(pch,"%s",dest);
 for(i=0;i<strlen(pch);i++)
{
       AstDebug("%x,%x\n",strlen(pch),pch[i]);
}
 delete dest;
   }    
  int   code_convert(char   *from_charset,char   *to_charset,char  *inbuf,size_t   inlen,char   *outbuf,size_t  outlen)   
  {   
  iconv_t   cd;   
  //int   rc;   
  char   **pin   =   &inbuf;   
  char   **pout   =   &outbuf;   
    
  cd  = iconv_open(to_charset,from_charset);   
  if   (cd==0)   
  return   -1;  
  AstDebug("cd:%d\n",cd);
  memset(outbuf,0,outlen);   
  
  if(iconv(cd,pin,&inlen,pout,&outlen)==-1) 
  {
   AstDebug("transport file error!1");
   return  -1;   
  }
  
  iconv_close(cd);   
  return   0;   
  }   
 
 
  int   g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)   
  {   
    return code_convert("","utf-8",inbuf,inlen,outbuf,outlen);  
     
  }  
cd的值都能读出来,268933920-268933926等等;
但是中文字符串的时候就("transport file error!1");
英文OK!请达人帮助!谢谢!

4 个解决方案

#1


在Linux/Unix里处理中文有些麻烦,日常维护这两种OS时也时常会有乱码出现,出现时的解决方案只有一个,重新登陆。

#2


主要原因是因为iconv(cd, &pin, &inlen, &pout, &outlen)这句运行之后
会改变pin,pout 所指向的位置,以及 inlen, outlen 的值. 

如果用刚分配的内存inbuf,执行上面的语句之后inbuf指向的位置会发生改变,

再释放inbuf, outbuf 就会出问题。

#3


还是不明白什么问题?想去查找下出错的原因!请问下在哪里可以找到出错信息!

#4


看看本地iconv -l里面有没有gbk的支持(估计应该有的)
要么看看文件里面有什么特殊字符?在命令行下用iconv直接转文件会把不能转的位置告诉你的

#1


在Linux/Unix里处理中文有些麻烦,日常维护这两种OS时也时常会有乱码出现,出现时的解决方案只有一个,重新登陆。

#2


主要原因是因为iconv(cd, &pin, &inlen, &pout, &outlen)这句运行之后
会改变pin,pout 所指向的位置,以及 inlen, outlen 的值. 

如果用刚分配的内存inbuf,执行上面的语句之后inbuf指向的位置会发生改变,

再释放inbuf, outbuf 就会出问题。

#3


还是不明白什么问题?想去查找下出错的原因!请问下在哪里可以找到出错信息!

#4


看看本地iconv -l里面有没有gbk的支持(估计应该有的)
要么看看文件里面有什么特殊字符?在命令行下用iconv直接转文件会把不能转的位置告诉你的