Chinaunix首页 | 论坛 | 博客
  • 博客访问: 441042
  • 博文数量: 126
  • 博客积分: 35
  • 博客等级: 民兵
  • 技术积分: 1262
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 16:39
文章分类

全部博文(126)

文章存档

2017年(2)

2016年(20)

2015年(64)

2014年(24)

2013年(16)

我的朋友

分类: C/C++

2014-09-19 13:42:07

64位linux


  1. #include <stdio.h>
  2. #include <iconv.h>
  3. #include <string.h>

  4. int code_conv(const char* fromcode,const char* tocode,const char* str_in,int inlen,char* str_out,int outsize)
  5. {
  6.     if (NULL==str_in || inlen<=0 || NULL==str_out || outsize<=0)
  7.     {
  8.         return -1; //入参错误
  9.     }

  10.     iconv_t i_cv = iconv_open(tocode, fromcode);
  11. printf(" i_cv :%ld\n", i_cv);
  12.     if ((iconv_t)-1 == i_cv)
  13.     {
  14.         return -2; //转换描述符申请失败
  15.     }

  16. printf("sizeof(iconv_t):%d\n", sizeof(iconv_t));
  17.     char** pp_in = (char**)&str_in;
  18.     char** pp_out = (char**)&str_out;
  19. int b=1;
  20.     int inleft = inlen;
  21.     int a=1;
  22.     size_t outleft = outsize;

  23.     if ((size_t)-1 == iconv(i_cv, pp_in, (size_t*)&inleft, pp_out, (size_t*)&outleft))
  24.     {
  25.         perror("iconv");
  26. printf(" i_cv :%ld\n", i_cv);
  27.         iconv_close(i_cv);
  28.         return -3; //转码失败
  29.     }

  30.     iconv_close(i_cv);
  31.     return outsize-outleft; //转码后的长度
  32. }

  33. main()
  34. {
  35.     char *in_utf8 = "姝e?ㄥ??瑁?";
  36.     char *in_gb2312 = "正在安装";
  37.     char str_out[512] = {0}; //据chenx说,此处out数组小可能导致转码失败
  38.     int in_len = strlen(in_gb2312);
  39.     int out_size = sizeof(str_out);

  40.     int n = code_conv("gb2312", "utf-8", in_gb2312, in_len, str_out, out_size);
  41.     if(n > 0)
  42.     {
  43.         printf("out:%s\n", str_out);
  44.         printf("out len:%d\n", n);
  45.     }
  46.     else
  47.     {
  48.         perror("code_conv");
  49.     }
  50.             printf("out:%s\n", str_out);
  51.         printf("out len:%d\n", n);
  52. }

  1. i_cv :324074912
  2. sizeof(iconv_t):8
  3. iconv: Invalid or incomplete multibyte or wide character
  4.  i_cv :324074911
  5. 段错误 (core dumped)

(size_t*)&inleft的用法显然是不对的。i_cv的值减少了1!如果在iconv_close尝试给i_cv加1,则报错:code_conv.cpp:30: 错误:‘void *’ 型指针用在了算术表达式
这是怎么发生的呢?

(未完待续)

阅读(1143) | 评论(0) | 转发(0) |
0

上一篇:安装pcap库

下一篇:架构设计的分层原则

给主人留下些什么吧!~~