字符集转换函数iconv的使用方法

3204阅读 0评论2013-01-01 lzj123
分类:C/C++

1 调用函数iconv_open(const char* tocode, const char* fromcode),此函数的返回值类型为iconv_t,这个返   回值在转换函数里面会用到,此返回值为-1表示出错。调用此函数时注意参数的顺序。字符编码可以通过命   令'iconv --list'查询。

2 调用函数iconv(iconv_t cd, char** inbuf, size_t* inleft, char** outbuf, size_t* outleft),函数参   数说明如下
  • iconv_t cd     : 【I  】iconv_open函数的返回值
  • char** inbuf   : 【I/O】转换对象。设置为一个字符指针的地址,这个字符指针指向需要变换的字符串,需要注意的是这个字符指针的值是会被改变的。
  • size_t* inleft : 【I/O】设置转换对象的长度。
  • char** outbuf  : 【I/O】转换目标。设置为一个字符指针的地址,这个字符指针指向一个存放被转换后字符串的buffer。
  • size_t* outleft: 【I/O】设置转换目标buffer的长度。
3 最后调用函数iconv_close(iconv_t cd)。

下面是一个例子。

点击(此处)折叠或打开

  1. #include <iconv.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <stdlib.h>

  6. int main(int argc, char *argv[ ])
  7. {
  8.     FILE* pfUtf8 = NULL;
  9.     FILE* pfSjis = NULL;
  10.     char acLine[1024];
  11.     char acOut[1024];
  12.     char* pcIn, *pcOut;
  13.     iconv_t ct;
  14.     size_t inleft = 0, outleft = 0;

  15.     if (argc != 3)
  16.     {
  17.         printf("usage:./a.out infile outfile.\n");
  18.         exit(1);
  19.     }

  20.     pfUtf8 = fopen(argv[1], "r+");
  21.     if (pfUtf8 == NULL)
  22.     {
  23.         printf("file(%s) open error.(%s)\n", argv[1], strerror(errno));
  24.         exit(2);
  25.     }

  26.     pfSjis = fopen(argv[2], "w+");
  27.     if (pfSjis == NULL)
  28.     {
  29.         printf("file(%s) open error.(%s)\n", argv[2], strerror(errno));
  30.         exit(3);
  31.     }

  32.     ct = iconv_open("SJIS", "UTF8");
  33.     if (ct == -1)
  34.     {
  35.         printf("iconv_open error.(%s)\n", strerror(errno));
  36.         exit(4);
  37.     }

  38.     while (fgets(acLine, sizeof(acLine), pfUtf8))
  39.     {
  40.         memset(acOut, 0, sizeof(acOut));
  41.         inleft = strlen(acLine);
  42.         outleft = sizeof(acOut);
  43.         pcIn = acLine;
  44.         pcOut = acOut;
  45.         
  46.         printf("acLine = %s\n", acLine);
  47.         if (iconv(ct, &pcIn, &inleft, &pcOut, &outleft) == -1)
  48.         {
  49.             printf("iconv error(%s).(%s)\n", pcIn, strerror(errno));
  50.             exit(5);
  51.         }

  52.         memset(acLine, 0, sizeof(acLine));
  53.         fputs(acOut, pfSjis);
  54.     }

  55.     iconv_close(ct);
  56.     fclose(pfUtf8);
  57.     fclose(pfSjis);

  58.     return 0;
  59. }

上一篇:键盘打字练习的程序
下一篇:getopt ,getopt_long使用方法