linux下的iconv转码问题

hacker1125 2009-06-01 04:53:18
想用C语言编写xml解析文件,要求把gb2312转为utf-8,使用了linux下的iconv进行转化,但是总是返回-1;无法转码,不知道是那里出问题,请大虾们帮忙,很急!
#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>
#include <string.h>

int main()
{
iconv_t cd;
char instr[]="汉字";
char *inbuf;
char *outbuf;
char *outptr;
unsigned int insize=strlen(instr);
unsigned int outputbufsize=10;
unsigned int avail=outputbufsize;
unsigned int nconv;
FILE *pf;

inbuf=instr;
outbuf=(char *)malloc(outputbufsize);
outptr=outbuf;
memset(outbuf,'\0',outputbufsize);

cd=iconv_open("utf-8","gb2312"); //将字符串编码由gb2312转换为utf-8
if(cd==(iconv_t)-1)
{
printf("fail.\n");
}
nconv=iconv(cd,&inbuf,&insize,&outptr,&avail);

printf("%s\n",outbuf);


//write xml file

pf = fopen("test.xml","wb");
if(!pf)
return 0;

strcpy(buf, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
fwrite(buf, 1, strlen(buf), pf);

memset(buf, 0, sizeof(buf));
sprintf(buf, "<Image FileName=\"test.xml\" OCRStatus=\"test\">\n");
fwrite(buf, 1, strlen(buf), pf);

memset(buf, 0, sizeof(buf));
sprintf(buf, "<Return Code =\"%d\">\n",res);
fwrite(buf, 1, strlen(buf), pf);

memset(buf, 0, sizeof(buf));
sprintf(buf,"\t<![CDATA[");
fwrite(buf, 1, strlen(buf), pf);

memset(buf, 0, sizeof(buf));
sprintf(buf,"%s",outbuf);
fwrite(buf, 1, strlen(buf), pf);

memset(buf, 0, sizeof(buf));
sprintf(buf, "\t]]>\n");
fwrite(buf, 1, strlen(buf), pf);

memset(buf, 0, sizeof(buf));
sprintf(buf, "</Return>\n");
fwrite(buf, 1, strlen(buf), pf);
memset(buf, 0, sizeof(buf));
sprintf (buf, "</Image>\n");
fwrite(buf, 1, strlen(buf), pf);


free(outbuf);
iconv_close(cd);
fclose(pf);

return 1;
}
...全文
511 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sherrylou 2011-06-25
  • 打赏
  • 举报
回复
哎,我的是在linux PC机上能够转化成功,但是mount到开发板上就傻了,iconv什么也不输出,肿么办啊。。。。iconv需要有什么库编译进文件系统么
meitolake 2009-06-02
  • 打赏
  • 举报
回复
我是在FreeBSD下編譯的,GCC版本是3.4.6,libiconv版本是1.11。
hacker1125 2009-06-02
  • 打赏
  • 举报
回复
大家帮帮忙阿,很急。。。
hacker1125 2009-06-02
  • 打赏
  • 举报
回复
您好,您是在什么环境下编译的?也是红帽子9.0 的gcc编译吗?
hacker1125 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 meitolake 的回复:]
在Gedit另存窗口下方有一個Character Coding菜單,裡面有一項是Add or Remove...,
點開之後,就可以選擇編碼了。
[/Quote]
收到,真的谢谢你,正如您说的那样是编码问题,“汉字”不是gb2312,在linux下就被转为utf8了,难怪没成功。
meitolake 2009-06-02
  • 打赏
  • 举报
回复
在Gedit另存窗口下方有一個Character Coding菜單,裡面有一項是Add or Remove...,
點開之後,就可以選擇編碼了。
hacker1125 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 meitolake 的回复:]
你還是應該確認一下源文件的編碼,以保證"汉字"這兩個字為GB2312編碼。
我是將你的這段代碼粘貼在Gedit裡,然後另存為GB2312編碼的文件,再進行編譯。
你是怎麼操作的?
[/Quote]
我Gedit另存为 怎么没有可以选择GB2312编码的?小弟对linux不是很熟悉,还望详细说下,谢谢
meitolake 2009-06-02
  • 打赏
  • 举报
回复
你還是應該確認一下源文件的編碼,以保證"汉字"這兩個字為GB2312編碼。
我是將你的這段代碼粘貼在Gedit裡,然後另存為GB2312編碼的文件,再進行編譯。
你是怎麼操作的?
hacker1125 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 meitolake 的回复:]
我是在FreeBSD下編譯的,GCC版本是3.4.6,libiconv版本是1.11。
[/Quote]
我的是red hat 9.0,应该可以支持这样的转换吧,怎么老不成功,郁闷阿
meitolake 2009-06-01
  • 打赏
  • 举报
回复
編譯了你的代碼,可以轉換。只是編譯時有一個警告:

g2u.c:28: warning: passing arg 2 of `libiconv' from incompatible pointer type

將char *inbuf;改為const char *inbuf;後,編譯時無任何警告。
hacker1125 2009-06-01
  • 打赏
  • 举报
回复
我用你这个,也是一样的。返回还是-1

我是在linux red hat 9.0下用gcc编译的。
w0911h 2009-06-01
  • 打赏
  • 举报
回复
这是我以前写的,可以正常使用,你试试看

int code_convert(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if(cd==0) return -1;

memset(outbuf,0,outlen);

if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;

iconv_close(cd);
return 0;
}

/*UNICODE码转为GB2312码*/
int u2g(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}

/*GB2312码转为UNICODE码*/
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}
hacker1125 2009-06-01
  • 打赏
  • 举报
回复
是的,“汉字”是GB2312,我把缓冲加大也是一样。

执行nconv=iconv(cd,&inbuf,&insize,&outptr,&avail);
时,
nconv是为-1了
w0911h 2009-06-01
  • 打赏
  • 举报
回复
看起来转换部分没什么问题,你确定你的"汉字"的编码是GB2312吗,可以先把strlen(instr)的值打出来看看,再把输出缓冲增大点看看

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧