为什么编码转换函数ICONV的返回值总是 -1 啊

ljx0305 2009-07-20 08:18:37
/* f.c : 代码转换示例C程序 */
#include <iconv.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

#define OUTLEN 255
/*代码转换:从一种编码转为另一种编码*/
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
iconv(cd, NULL, NULL, NULL, NULL);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1)
{
switch(errno)
{
case E2BIG:
printf("E2BiG");
break;
case EILSEQ:
printf("EILSEQ");
break;
case EINVAL:
printf("EINVAL");
break;
}
return -1;
}
iconv_close(cd);
return 0;
}
/*UNICODE码转为GB2312码*/
int u2g(char *inbuf,int inlen,char *outbuf,int 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);
}
main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "a正x在c安z装a";
char out[OUTLEN];
int rc;
/*unicode码转为gb2312码*/
rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf("unicode-->gb2312 out=%sn",out);
//gb2312码转为unicode码

rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
FILE * pf = fopen("out.txt","a+");
fprintf(pf,out);
fclose(pf);
printf("gb2312-->unicode out=%sn",out);
}


该段代码是进行gb2312到utf-8和utf-8到gb2312进行编码转换,不管是哪种iconv这个函数的返回值总是-1 并且errno对应的是 EILSEQ
请高人帮帮忙啊
...全文
2787 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
f1120c 2012-09-04
  • 打赏
  • 举报
回复
我也是这个错误啊
panguowen8 2012-04-23
  • 打赏
  • 举报
回复
楼主,请问这个问题解决了没有啊?我也遇到这个问题,一直返回-1.且错误号是9
azs14789 2011-04-18
  • 打赏
  • 举报
回复
iconv_open()返回-1 才应该return吧 虽然我不知道为什么你转换失败
ljx0305 2009-12-13
  • 打赏
  • 举报
回复
你们都用什么编译环境啊,我是跑完的结果一直报这个错,很无语啊
kisszrq 2009-10-23
  • 打赏
  • 举报
回复
没问题啊,你自己再看看
xhy_851221 2009-10-22
  • 打赏
  • 举报
回复
up
steptodream 2009-10-22
  • 打赏
  • 举报
回复
楼主 我测试你的代码没问题呀 你自己再检查一下额
yhf365 2009-07-20
  • 打赏
  • 举报
回复
楼主的代码保存格式是什么?
可能跟保存格式也有关。
我用的是UTF-8格式。
这是全部代码。
和你的代码几乎一样,
没有报错。

#include <iconv.h>
#include <errno.h>
#define OUTLEN 255
main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "正在安装";
char out[OUTLEN];
int rc;
/*unicode码转为gb2312码*/
rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf("unicode-->gb2312 out=%sn",out);
//gb2312码转为unicode码

rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf("gb2312-->unicode out=%sn",out);
}
/*代码转换:从一种编码转为另一种编码*/
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
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)
{
switch(errno)
{
case E2BIG:
printf("E2BiG");
break;
case EILSEQ:
printf("EILSEQ");
break;
case EINVAL:
printf("EINVAL");
break;
}
return -1;
}
iconv_close(cd);
return 0;
}
/*UNICODE码转为GB2312码*/
int u2g(char *inbuf,int inlen,char *outbuf,int 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);
}

楼主再仔细检查一下吧。
gettype gettype — 获取变量的类型 explode — 使用一个字符串分割另一个字符串 iconv转换字符串编码 I/O函数 Flush 函数描述:flush(); 说明:函数Flush刷新PHP的输出缓存,它尽量将缓和存中的内容输出到用户的浏览器。 返回值:无 Print 函数描述:print(string arg,string[arg],…); 说明:函数print输入所有的参数。 返回值:若输出成功,返回true(1);否则返回false(0)。 Printf 函数描述:printf(string format,mixed[string]); 说明:函数printf根据所给格式format,输出string。格式以一个%开头,以一个字母结尾,该字母决定输出的数据类型。PHP的类型说明符如表所示。 PHP的类型说明符 类型说明符 说 明 b 输出二进制整数 o 输出八进制整数 x,X 输出十六进制整数,“x”使用小写字母,“X”使用大写字母 d 输出十进制整数 c 输出由整数ASCII代码说明的字符 s 输出字符串 f 输出浮点数 e 输出用科学计数法表示的浮点数 % 输出一个百分号 返回值:无 正规表达式函数 Ereg 函数描述:int ereg (string pattern ,string string ,array[regs]); 说明:函数ereg在参数string中寻找pattern中给出的正规表达式相匹配的项。如果提供了可选reg数组,则每一项匹配将顺序存储在数组regs[1]开始的各项中。在regs[0]中存储整个正规表达式的匹配项。在函数ereg中,匹配的辨别是区分大小写的。请参看以下程序 返回值:若至少有一处匹配

23,114

社区成员

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

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