免费注册 查看新帖 |

Chinaunix

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

再请教一个问题,关于iconv的,返回失败,但转换成功了,不知道原因。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-29 14:22 |只看该作者 |倒序浏览
下面是代码,转化成功了,但iconv返回-1,errno为84,errno.84 is: Invalid or incomplete multibyte or wide character
不知道原因,请高手指点。
  1. #include <iconv.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <errno.h>
  6. #define OUTLEN 255
  7. //代码转换:从一种编码转为另一种编码
  8. int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
  9. {
  10. iconv_t cd;
  11. int rc;
  12. char **pin = &inbuf;
  13. char **pout = &outbuf;

  14. cd = iconv_open(to_charset,from_charset);
  15. if (cd==0) return -1;
  16. memset(outbuf,0,outlen);
  17. if (iconv(cd,pin,(size_t*)&inlen,pout,(size_t*)&outlen)==-1) return -1;
  18. iconv_close(cd);
  19. return 0;
  20. }
  21. //UNICODE码转为GB2312码
  22. int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
  23. {
  24. return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
  25. }
  26. //GB2312码转为UNICODE码
  27. int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
  28. {
  29. return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
  30. }

  31. main()
  32. {
  33. char *in_utf8 = "姝e?ㄥ??瑁?";
  34. char *in_gb2312 = "正在安装";
  35. char out[OUTLEN];

  36. //unicode码转为gb2312码
  37. int rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
  38. printf("rc:%d, errno:%d, unicode-->gb2312 out=%sn",rc,errno, out);
  39. //gb2312码转为unicode码
  40. rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
  41. printf("rc:%d, errno:%d, gb2312-->unicode out=%sn",rc,errno,out);
  42. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-11-29 15:11 |只看该作者
本帖最后由 lj56630325 于 2010-11-29 15:13 编辑

export info in bash:

  1. declare -x LANG="zh_CN.utf8"
  2. declare -x LC_ALL=""
  3. declare -x LC_CTYPE="zh_CN.utf8"
复制代码
我的main, 其他一样.

  1. main()
  2. {
  3.     char *in_utf8 = "正在安装"; //
  4.     char out[OUTLEN];
  5.     char out_gb2312[OUTLEN];

  6.     //unicode码转为gb2312码
  7.     int rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
  8.     printf("rc:%d, errno:%d, unicode-->gb2312 out=%s\n",rc,errno, out);                                               
  9.     //gb2312码转为unicode码
  10.     rc = g2u(out,strlen(out),out_gb2312,OUTLEN);
  11.     printf("rc:%d, errno:%d, gb2312-->unicode out=%s\n",rc,errno,out_gb2312);                                         
  12. }

复制代码

论坛徽章:
0
3 [报告]
发表于 2010-11-29 15:13 |只看该作者
输出

  1. rc:0, errno:0, unicode-->gb2312 out=
  2. rc:0, errno:0, gb2312-->unicode out=正在安装
复制代码
可能你的"正在安装"不是gb2312

论坛徽章:
0
4 [报告]
发表于 2010-11-29 16:11 |只看该作者
输出可能你的"正在安装"不是gb2312
lj56630325 发表于 2010-11-29 15:13



    非常感谢您的回答,我按照您的代码试了一下还是不行:
rc:-1, errno:84, unicode-->gb2312 out=���ڰ�װ
rc:-1, errno:84, gb2312-->unicode out=正在安装
通过gdb,发现第一行输出地确实是gbk编码,我的终端是utf8编码的,所以第二行可以看到。
而且文件格式我是通过iconv改变成utf8的,
[user@localhost1 test]$ file 4.c
4.c: UTF-8 Unicode C program text

也是utf8,输出还是有问题,请再次指教。。。。

论坛徽章:
0
5 [报告]
发表于 2010-11-29 16:32 |只看该作者
输出可能你的"正在安装"不是gb2312
lj56630325 发表于 2010-11-29 15:13



    您好,您运行的代码就是我放在上面的代码吗?

论坛徽章:
0
6 [报告]
发表于 2010-11-29 16:46 |只看该作者
关键是虽然返回成功,但是却转换成功了。。。,很是纳闷。。。

论坛徽章:
0
7 [报告]
发表于 2010-11-29 17:29 |只看该作者
回复 5# rain_fish
1) 我用的代码是2楼贴的代码.

2) 我确定的是我程序中的"正在安装"是UTF8的. (我的BASH是UTF8的, 我手动输入的"正在安装")

3) 你应该检测你程序的字符是什么编码的. 这个跟文件(4.c: UTF-8 Unicode C program text)是UTF8有没有关系, 我不清楚.

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
8 [报告]
发表于 2010-11-30 12:29 |只看该作者
关键是虽然返回成功,但是却转换成功了。。。,很是纳闷。。。
rain_fish 发表于 2010-11-29 16:46



很可能是你的多字节字符串最后一个字符是不完整的,所谓转换成功, 大概是之前的转换成功了, 而后面跟着错误不可见的半个字符

论坛徽章:
0
9 [报告]
发表于 2010-11-30 13:44 |只看该作者
很可能是你的多字节字符串最后一个字符是不完整的,所谓转换成功, 大概是之前的转换成功了, 而后面 ...
zylthinking 发表于 2010-11-30 12:29



    我确定后没有不完整的字符,很是纳闷,刚才在虚拟机上测试了一下,竟然成功。不知道是什么原因了

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2010-11-30 15:44 |只看该作者
我确定后没有不完整的字符,很是纳闷,刚才在虚拟机上测试了一下,竟然成功。不知道是什么原因了
rain_fish 发表于 2010-11-30 13:44



淡定, 淡定。。。。。。。。{:3_189:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP