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 就会出问题。
会改变pin,pout 所指向的位置,以及 inlen, outlen 的值.
如果用刚分配的内存inbuf,执行上面的语句之后inbuf指向的位置会发生改变,
再释放inbuf, outbuf 就会出问题。
#3
还是不明白什么问题?想去查找下出错的原因!请问下在哪里可以找到出错信息!
#4
看看本地iconv -l里面有没有gbk的支持(估计应该有的)
要么看看文件里面有什么特殊字符?在命令行下用iconv直接转文件会把不能转的位置告诉你的
要么看看文件里面有什么特殊字符?在命令行下用iconv直接转文件会把不能转的位置告诉你的
#1
在Linux/Unix里处理中文有些麻烦,日常维护这两种OS时也时常会有乱码出现,出现时的解决方案只有一个,重新登陆。
#2
主要原因是因为iconv(cd, &pin, &inlen, &pout, &outlen)这句运行之后
会改变pin,pout 所指向的位置,以及 inlen, outlen 的值.
如果用刚分配的内存inbuf,执行上面的语句之后inbuf指向的位置会发生改变,
再释放inbuf, outbuf 就会出问题。
会改变pin,pout 所指向的位置,以及 inlen, outlen 的值.
如果用刚分配的内存inbuf,执行上面的语句之后inbuf指向的位置会发生改变,
再释放inbuf, outbuf 就会出问题。
#3
还是不明白什么问题?想去查找下出错的原因!请问下在哪里可以找到出错信息!
#4
看看本地iconv -l里面有没有gbk的支持(估计应该有的)
要么看看文件里面有什么特殊字符?在命令行下用iconv直接转文件会把不能转的位置告诉你的
要么看看文件里面有什么特殊字符?在命令行下用iconv直接转文件会把不能转的位置告诉你的