iconv是linux下的编码转换的工具,它提供命令行的使用和函数接口支持

man手册iconv命令用法如下:

iconv -f encoding -t encoding inputfile

有如下选项可用:

输入/输出格式规范:

-f, --from-code=名称 原始文本编码
-t, --to-code=名称 输出编码

信息:

-l, --list 列举所有已知的字符集

输出控制:

-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息

示例:下面的命令是将一个utf8编码的文件转换为一个unicode编码的文件

iconv -f utf- -t unicode utf8file.txt> unicodefile.txt

iconv函数族的头文件是iconv.h,使用前需包含之。

#include <iconv.h>

iconv函数族有三个函数,原型如下:

iconv_t iconv_open(const char *tocode, const char *fromcode);

此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。

size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);

此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。

注意:inbuf和outbuf都必须是有存储空间的不能定义为常量,如:char *inbuf = "abc" 或者是char *outbuf = "123"这样定义都是错误的。另外inbuf,inbytesleft,outbuf,outbytesleft这几个参数在使用过程中都会改变,最好是先保存一下原值,然后再使用

int iconv_close(iconv_t cd);

此函数用于关闭转换句柄,释放资源。

基本使用举例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h> int main(int argc, char **argv)
{
/* 目的编码, TRANSLIT:遇到无法转换的字符就找相近字符替换
* IGNORE :遇到无法转换字符跳过*/
//char *encTo = "UNICODE//TRANSLIT";
char *encTo = "UNICODE//IGNORE";
/* 源编码 */
char *encFrom = "UTF-8"; /* 获得转换句柄
*@param encTo 目标编码方式
*@param encFrom 源编码方式
*
* */
iconv_t cd = iconv_open (encTo, encFrom);
if (cd == (iconv_t)-)
{
perror ("iconv_open");
} /* 需要转换的字符串 */
char inbuf[] = "abcdef哈哈哈哈行";
size_t srclen = strlen (inbuf);
/* 打印需要转换的字符串的长度 */
printf("srclen=%d\n", srclen); /* 存放转换后的字符串 */
size_t outlen = ;
char outbuf[outlen];
memset (outbuf, , outlen); /* 由于iconv()函数会修改指针,所以要保存源指针 */
char *srcstart = inbuf;
char *tempoutbuf = outbuf; /* 进行转换
*@param cd iconv_open()产生的句柄
*@param srcstart 需要转换的字符串
*@param srclen 存放还有多少字符没有转换
*@param tempoutbuf 存放转换后的字符串
*@param outlen 存放转换后,tempoutbuf剩余的空间
*
* */
size_t ret = iconv (cd, &srcstart, &srclen, &tempoutbuf, &outlen);
if (ret == -)
{
perror ("iconv");
}
printf ("inbuf=%s, srclen=%d, outbuf=%s, outlen=%d\n", inbuf, srclen, outbuf, outlen);
int i = 0;
for (i=; i<strlen(outbuf); i++)
{
printf("%x\n", outbuf[i]);
}
/* 关闭句柄 */
iconv_close (cd); return ;
}

下面做了一下函数的封装:

/*
* =====================================================================================
*
* Filename: iconv.c
*
* Description: j
*
* Version: 1.0
* Created: 08/05/2015 05:51:47 PM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <iconv.h>
bool unicode_to_utf8 (char *inbuf, size_t *inlen, char *outbuf, size_t *outlen)
{
/* 目的编码, TRANSLIT:遇到无法转换的字符就找相近字符替换
* IGNORE :遇到无法转换字符跳过*/
char *encTo = "UTF-8//IGNORE";
/* 源编码 */
char *encFrom = "UNICODE"; /* 获得转换句柄
*@param encTo 目标编码方式
*@param encFrom 源编码方式
*
* */
iconv_t cd = iconv_open (encTo, encFrom);
if (cd == (iconv_t)-)
{
perror ("iconv_open");
} /* 需要转换的字符串 */
printf("inbuf=%s\n", inbuf); /* 打印需要转换的字符串的长度 */
printf("inlen=%d\n", *inlen); /* 由于iconv()函数会修改指针,所以要保存源指针 */
char *tmpin = inbuf;
char *tmpout = outbuf;
size_t insize = *inlen;
size_t outsize = *outlen; /* 进行转换
*@param cd iconv_open()产生的句柄
*@param srcstart 需要转换的字符串
*@param inlen 存放还有多少字符没有转换
*@param tempoutbuf 存放转换后的字符串
*@param outlen 存放转换后,tempoutbuf剩余的空间
*
* */
size_t ret = iconv (cd, &tmpin, inlen, &tmpout, outlen);
if (ret == -)
{
perror ("iconv");
} /* 存放转换后的字符串 */
printf("outbuf=%s\n", outbuf); //存放转换后outbuf剩余的空间
printf("outlen=%d\n", *outlen); int i = ; for (i=; i<(outsize- (*outlen)); i++)
{
//printf("%2c", outbuf[i]);
printf("%x\n", outbuf[i]);
} /* 关闭句柄 */
iconv_close (cd); return ;
} bool utf8_to_unicode (char *inbuf, size_t *inlen, char *outbuf, size_t *outlen)
{ /* 目的编码, TRANSLIT:遇到无法转换的字符就找相近字符替换
* IGNORE :遇到无法转换字符跳过*/
char *encTo = "UNICODE//IGNORE";
/* 源编码 */
char *encFrom = "UTF-8"; /* 获得转换句柄
*@param encTo 目标编码方式
*@param encFrom 源编码方式
*
* */
iconv_t cd = iconv_open (encTo, encFrom);
if (cd == (iconv_t)-)
{
perror ("iconv_open");
} /* 需要转换的字符串 */
printf("inbuf=%s\n", inbuf); /* 打印需要转换的字符串的长度 */
printf("inlen=%d\n", *inlen); /* 由于iconv()函数会修改指针,所以要保存源指针 */
char *tmpin = inbuf;
char *tmpout = outbuf;
size_t insize = *inlen;
size_t outsize = *outlen; /* 进行转换
*@param cd iconv_open()产生的句柄
*@param srcstart 需要转换的字符串
*@param inlen 存放还有多少字符没有转换
*@param tempoutbuf 存放转换后的字符串
*@param outlen 存放转换后,tempoutbuf剩余的空间
*
* */
size_t ret = iconv (cd, &tmpin, inlen, &tmpout, outlen);
if (ret == -)
{
perror ("iconv");
} /* 存放转换后的字符串 */
printf("outbuf=%s\n", outbuf); //存放转换后outbuf剩余的空间
printf("outlen=%d\n", *outlen); int i = ; for (i=; i<(outsize- (*outlen)); i++)
{
//printf("%2c", outbuf[i]);
printf("%x\n", outbuf[i]);
} /* 关闭句柄 */
iconv_close (cd); return ;
} int main ()
{
/* 需要转换的字符串 */
//char inbuf[1024] = "abcdef哈哈哈哈行";
char *text = "汉"; char inbuf[] = {};
strcpy (inbuf, text);
size_t inlen = strlen (inbuf); /* 存放转换后的字符串 */
char outbuf[] = {};
size_t outlen = ; utf8_to_unicode (inbuf, &inlen, outbuf, &outlen);
printf ("print outbuf: %s\n", outbuf); size_t outsize = strlen(outbuf);
size_t insize = ;
char instr[] = {};
unicode_to_utf8 (outbuf, &outsize, instr, &insize);
printf ("print buf: %s\n", instr);
return ;
}

最新文章

  1. 浅入tomcat
  2. ASP.NET Core Kestrel 中使用 HTTPS (SSL)
  3. DDD~领域事件与事件总线
  4. Running With xpi
  5. jQuery--checkbox全选
  6. OC登陆界面登陆按钮动画
  7. phongap+ jquery + asp.net +android,我把我遇到的问题和处理方法的连接总结一下
  8. mysql 优化analyze table
  9. LuaFileSystem学习心得
  10. javascript跨域请求RESTful Web Service
  11. 招商银行支付dll在64位windows系统下的注册使用问题
  12. python 单元测试
  13. nyoj 1237 最大岛屿(dfs)
  14. jquery插件的编写
  15. cocos2d-x环境搭建(win7+cocos2d-x-3.0)
  16. Telephone Lines USACO 月赛
  17. SPU和SKU有什么区别
  18. html与ios交互方法 WebViewJavascriptBridge
  19. nginx,maven
  20. python安装与pip操作

热门文章

  1. 1930: [Shoi2003]pacman 吃豆豆
  2. mysql系列之9.mysql日志&amp;存储引擎
  3. Pentaho BIServer Community Edtion 6.1 使用教程 第三篇 发布和调度Kettle(Data Integration) 脚本 Job &amp; Trans
  4. Pentaho BIServer Community Edtion 6.1 使用教程 第一篇 软件安装
  5. JDK动态proxy原理解析
  6. java和js互调 拨打电话
  7. git功能速查
  8. mini2440 最小根文件系统制作和nfs启动
  9. SDUT OJ 2616 简单计算
  10. POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串