利用 libiconv 实现汉字编码 utf-8 格式 和 gbk格式的相互转换

时间:2021-11-17 03:55:52

参考文章:http://jimmee.iteye.com/blog/2174693

关于windows上编译libiconv的库,请参见:http://www.cnblogs.com/tangxin-blog/p/5608751.html

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdint.h>
  4 #include <stdlib.h>
  5 #include "iconv.h"
  6 
  7 #define MAX_BUF_SIZE 1024
  8 
  9 int code_convert(char *from_charset, char *to_charset, char *inbuf, size_t inlen,
 10     char *outbuf, size_t outlen) {
 11     iconv_t cd;
 12     char **pin = &inbuf;
 13     char **pout = &outbuf;
 14 
 15     cd = iconv_open(to_charset, from_charset);
 16     if (cd == 0)
 17         return -1;
 18     memset(outbuf, 0, outlen);
 19     if (iconv(cd, pin, &inlen, pout, &outlen) == -1)
 20         return -1;
 21     iconv_close(cd);
 22     *pout = '\0';
 23 
 24     return 0;
 25 }
 26 
 27 int utf8_to_gbk(char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
 28     return code_convert("utf-8", "gbk", inbuf, inlen, outbuf, outlen);
 29 }
 30 
 31 int gbk_to_utf8(char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
 32     return code_convert("gbk", "utf-8", inbuf, inlen, outbuf, outlen);
 33 }
 34 
 35 void read_file(char buf[], const int32_t max_buf_size, const char *file_name)
 36 {
 37     FILE * pFile;
 38     long lSize;
 39     size_t result;
 40     fopen_s(&pFile, file_name, "rb");
 41     if (pFile == NULL) { fputs("File error\n", stderr); exit(1); }
 42     // obtain file size:
 43     fseek(pFile, 0, SEEK_END);
 44     lSize = ftell(pFile);
 45     rewind(pFile);
 46     if (lSize >= max_buf_size){ fputs("file too large\n", stderr); exit(1); }
 47     result = fread(buf, 1, lSize, pFile);
 48     if (result != lSize) { fputs("Reading error\n", stderr); exit(3); }
 49     fclose(pFile);
 50 }
 51 
 52 //将gbk编码的str分隔成一个一个的字符,并判断是否是汉字,并输出编码,包括简体和繁体
 53 void GetToken(const char *str)
 54 {
 55     int32_t i = 0;
 56     int32_t len = strlen(str);
 57     short high, low;
 58     uint32_t code;
 59     char cstr[3];
 60     for (; i < len; ++i)
 61     {
 62         if (str[i] >= 0 || i == len - 1)
 63         {
 64             printf("%c >> no\n", str[i]);   //ASCII字符
 65         }
 66         else
 67         {
 68             // 计算编码
 69             high = (short)str[i] + 256;
 70             low = (short)str[i + 1] + 256;
 71             code = high * 256 + low;
 72 
 73             //获取字符
 74             cstr[0] = str[i];
 75             cstr[1] = str[i + 1];
 76             cstr[2] = 0;
 77             i++;
 78 
 79             printf("%s >> 0x%x", cstr, code);
 80             if ((code >= 0xB0A1 && code <= 0xF7FE) || (code >= 0x8140 && code <= 0xA0FE) || (code >= 0xAA40 && code <= 0xFEA0))
 81             {
 82                 printf(" yes\n");
 83             }
 84             else
 85             {
 86                 printf(" no\n");
 87             }
 88         }
 89     }
 90 }
 91 
 92 int main(int argc, char *argv[])
 93 {
 94     char in_buf[MAX_BUF_SIZE] = { 0 }, out_buf[MAX_BUF_SIZE] = { 0 };
 95     read_file(in_buf, MAX_BUF_SIZE, "chinese_gbk.txt");
 96     printf("%s\n", in_buf);
 97     GetToken(in_buf);
 98     read_file(in_buf, MAX_BUF_SIZE, "chinese_utf8.txt");
 99     printf("%s\n", in_buf);
100     GetToken(in_buf);
101     utf8_to_gbk(in_buf, strlen(in_buf), out_buf, MAX_BUF_SIZE);
102     printf("%s\n", out_buf);
103     GetToken(out_buf);
104     getchar();
105     return 0;
106 }

 完整工程demo:http://download.csdn.net/detail/tangxin19930330/9557218