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

参考文章: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

时间: 2024-09-29 03:01:47

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

如何利用 iTunes 把 m4a/wav 文件转成 MP3 格式

MAC技巧 | 如何利用 iTunes 把 m4a/wav 文件转成 MP3 格式 - 简书 原文地址:https://www.cnblogs.com/gitwow/p/11100216.html

HTTP请求格式和响应格式

当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成: l   请求方法URI协议/版本 l   请求头(Request Header) l   请求正文 下面是一个HTTP请求的例子: GET/sample.jspHTTP/1.1 Accept:image/gif.image/jpeg,*/* Accept-Language:zh-cn Connection:Keep-Alive Host:localhost User-Agent:Mozi

如何将FLAC格式转为MP3格式

FLAC是一种无损压缩格式,也就是说音频以FLAC编码压缩后不会丢失任何信息,并且将FLAC文件还原后与压缩前的文件内容相同.由于FLAC的无损压缩性质导致它所占储存空间也很大,特别对于喜欢听音乐的爱好者来说,手机上会有很多FLAC格式音乐,相对应就比较占手机内存.这个时候就很麻烦,如果把歌删了会很心疼,如果不删歌太多手机内存又不够,真的很无奈,这个时候要是能把FLAC格式转换为MP3格式保存就好了. 迅捷视频转换器http://www.xunjieshipin.com/download-con

AngularJS过滤器filter-时间日期格式-渲染日期格式-$filter

今天遇到了这些问题索性就 写篇文章吧 话不多说直接上栗子 不管任何是HTML格式还是JS格式必须要在  controller 里面写 // new Date() 获取当前时间 yyyy-MM-ddd //是返回的格式 下面会一 一列出 这种返回格式$scope.wwwwwww = $filter(new Date(),'yyyy-MM-dd') //或者这样写//这样是 指定date类型 可以省略不写 下面的是多此一举 但是我感觉有人会钻牛角尖所以嘛 嘿嘿 $scope.wwwwwww = $f

把硬盘格式化成ext格式的cpu占用率就下来了

把硬盘格式化成ext格式的cpu占用率就下来了我是使用ext4格式 @Paulz 还有这种事情? 现在是什么格式?- - ,你自己用top命令看一下啊就知道什么东西在占用cpu了下载软件一半cpu都用在ntfs3g上了,有个球用 这些命令我都懂,但是我怎么没想到关键是你这硬盘就需要专用路由器了,

Python:将utf-8格式的文件转换成gbk格式的文件

需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.open(filePath,"r",encoding) as f: return f.read() def WriteFile(filePath,u,encoding="gbk"): with codecs.open(filePath,"w",encodi

【转】如何将FLAC格式转为MP3格式

原文网址:http://jingyan.baidu.com/ae/3aed632e65708470108091ca.html FLAC全称为无损音频压缩编码,FLAC格式又称无损格式 不会破坏原有的音频内容,从而能还原音乐光碟的音质 音质比其他的有损压缩格式(如MP3)的音质好 但FLAC格式的音乐文件较大,不便于储存空间小的移动设备携带 且大多数人们并不会对音质有着特别的要求,MP3格式即可满足 所以可以将FLAC格式的音频文件转为MP3,节省储存空间 MediaCoder是一个非常强大的格式

Linux下时间戳格式和标准时间格式的转换

大家都知道linux文件系统中的每个文件都有三种时间戳: 访问时间(atime--access time):就是上次访问这个文件的时间. 改变时间(ctime--change time):就是文件的inode改变的时间(什么是inode?)当你往一个文件中添加数据或者删除数据的时候,修改文件所有者的时候,链接改变的时候,文件的ctime就会发生改变. 修改时间(mtime--modification time):就是文件的内容上一次发生改变的时候的时间. 在LINUX系统中,有许多场合都使用时间

将任意一个jQuery对象进行表单序列化,免除了提交请求时大量拼写表单数据的烦恼,支持键值对&lt;name&amp;value&gt;格式和JSON格式。

http://zhengxinlong.iteye.com/blog/848712 将任意一个jQuery对象进行表单序列化,免除了提交请求时大量拼写表单数据的烦恼,支持键值对<name&value>格式和JSON格式. /// <reference name="jquery.js" description="1.3.2版本以上" /> /*!* 扩展jQuery表单序列化函数:{ Version: 1.2, Author: Eric