Chinaunix

标题: 结果成功了,但iconv返回错误了 [打印本页]

作者: tempname_cn    时间: 2008-10-09 16:15
标题: 结果成功了,但iconv返回错误了
#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 编辑 ]
作者: lemoncookie    时间: 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 编辑 ]
作者: tempname_cn    时间: 2008-10-09 16:30
谢谢了,你知道怎么把

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

去掉中间的空格

转换成对应的中文塑料布吗
作者: lemoncookie    时间: 2008-10-09 16:44
标题: 回复 #3 tempname_cn 的帖子
不太确定你问的什么意思
如果你用iconv的话,首先你得有个源src,然后转换成目标编码的的结果dst
源的编码和目标编码都要作为参数给iconv_open,这时候如果指定错了后面iconv当然出错
作者: tempname_cn    时间: 2008-10-09 17:06
& # x 5851;& # x 6599;& # x 5E03;(去掉中间空格)是塑料布的utf8码,我想转成gb2312的中文,不清楚怎么转
作者: tempname_cn    时间: 2008-10-09 17:10
& # x 5851;& # x 6599;& # x 5E03;(去掉中间空格)是塑料布的utf8码,我想转成gb2312的中文,不清楚怎么转,用C语言
作者: lemoncookie    时间: 2008-10-09 20:45
标题: 回复 #6 tempname_cn 的帖子
ft,你自己程序都写在那边了,不知道你想干什么




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2