免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7610 | 回复: 6
打印 上一主题 下一主题

结果成功了,但iconv返回错误了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-09 16:15 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>
#include <errno.h>

int Convert(char* encFrom, char* encTo, const char* in, int in_len, char* out, int out_len)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* sin, *sout;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int ret;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_t c_pt;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("1\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((c_pt = iconv_open(encTo, encFrom)) == (iconv_t)-1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("c_pt == -1\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv(c_pt, NULL, NULL, NULL, NULL);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin = (char*)in;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sout = (char*)out;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("2\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = iconv(c_pt, &sin, (size_t*)&in_len, &sout, (size_t*)&out_len);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("3\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("ret = %d\n", ret);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret == (size_t)-1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(errno == E2BIG)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("errno == E2BIG\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(errno == EILSEQ)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("errno == EILSEQ\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(errno == EINVAL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("errno == EINVAL\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(c_pt);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("iconv error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(c_pt);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;
}
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char buf[200];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char buffer[200];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char buffer1[200];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* str = "你好";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* str1 = "塑料布";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(buf, '\0', sizeof(buf));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(buffer, '\0', sizeof(buffer));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(buffer1, '\0', sizeof(buffer1));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convert("GB2312 ", "utf-8", str, strlen(str)+1, buf, sizeof(buf));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convert("utf-8", "GB2312", buf, strlen(buf)+1, buffer, sizeof(buffer));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convert("utf-8", "GB2312", str1, strlen(str1)+1, buffer1, sizeof(buffer1));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("buf = %s, buffer = %s, buffer1 = %s\n", buf, buffer, buffer1);
}






输出
tempname@ubuntu:~$ ./a.out
1
2
3
ret = -1
errno == EILSEQ
iconv error
1
2
3
ret = -1
errno == EILSEQ
iconv error
1
2
3
ret = -1
errno == EILSEQ
iconv error
buf = 浣犲ソ, buffer = 你好, buffer1 = 塑料布

str1是& # x 5851;& # x 6599;& # x 5E03;
buffer1是& # x 5851;& # x 6599;& # x 5E03;

去掉中间的空格

[ 本帖最后由 tempname_cn 于 2008-10-9 16:19 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-09 16:27 |只看该作者

回复 #1 tempname_cn 的帖子

与你的源程序的编码方式有关
程序中的汉字本身就有其编码方式,看你自己的环境了
我用的utf8测试你的例子
第一个会return EILLSEQ,当然了,因为第一次iconv试图把我程序中utf8编码的字符解释成gb2312再转换成utf8,这就出错了,返回EILLSEQ正说明了这个错误
第二个和第三个没问题,这就是因为我的环境下代码里的汉字就是utf8编码的,iconv试图从utf8转成gb2312就没问题了

你现在出现这个问题应该是你程序的编码既不是gb2312也不是utf8
你得搞清你源程序的编码,照这个错误看,我估计是gbk的多了,你试试从gbk转换?
或者把程序转成gb2312/utf8编码重新编译

[ 本帖最后由 lemoncookie 于 2008-10-9 16:28 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-10-09 16:30 |只看该作者
谢谢了,你知道怎么把

str1是& # x 5851;& # x 6599;& # x 5E03;
buffer1是& # x 5851;& # x 6599;& # x 5E03;

去掉中间的空格

转换成对应的中文塑料布吗

论坛徽章:
0
4 [报告]
发表于 2008-10-09 16:44 |只看该作者

回复 #3 tempname_cn 的帖子

不太确定你问的什么意思
如果你用iconv的话,首先你得有个源src,然后转换成目标编码的的结果dst
源的编码和目标编码都要作为参数给iconv_open,这时候如果指定错了后面iconv当然出错

论坛徽章:
0
5 [报告]
发表于 2008-10-09 17:06 |只看该作者
& # x 5851;& # x 6599;& # x 5E03;(去掉中间空格)是塑料布的utf8码,我想转成gb2312的中文,不清楚怎么转

论坛徽章:
0
6 [报告]
发表于 2008-10-09 17:10 |只看该作者
& # x 5851;& # x 6599;& # x 5E03;(去掉中间空格)是塑料布的utf8码,我想转成gb2312的中文,不清楚怎么转,用C语言

论坛徽章:
0
7 [报告]
发表于 2008-10-09 20:45 |只看该作者

回复 #6 tempname_cn 的帖子

ft,你自己程序都写在那边了,不知道你想干什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP