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

函数接口

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);
此函数用于关闭转换句柄,释放资源。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <iconv.h>
  6. bool unicode_to_utf8 (char *inbuf, size_t *inlen, char *outbuf, size_t *outlen)
  7. {
  8. /* 目的编码, TRANSLIT:遇到无法转换的字符就找相近字符替换
  9. * IGNORE :遇到无法转换字符跳过*/
  10. char *encTo = "UTF-8//IGNORE";
  11. /* 源编码 */
  12. char *encFrom = "UNICODE";
  13.  
  14. /* 获得转换句柄
  15. *@param encTo 目标编码方式
  16. *@param encFrom 源编码方式
  17. * */
  18. iconv_t cd = iconv_open (encTo, encFrom);
  19. )
  20. {
  21. perror ("iconv_open");
  22. }
  23.  
  24. /* 需要转换的字符串 */
  25. printf("inbuf=%s\n", inbuf);
  26.  
  27. /* 打印需要转换的字符串的长度 */
  28. printf("inlen=%d\n", *inlen);
  29.  
  30. /* 由于iconv()函数会修改指针,所以要保存源指针 */
  31. char *tmpin = inbuf;
  32. char *tmpout = outbuf;
  33. size_t insize = *inlen;
  34. size_t outsize = *outlen;
  35.  
  36. /* 进行转换
  37. *@param cd iconv_open()产生的句柄
  38. *@param srcstart 需要转换的字符串
  39. *@param inlen 存放还有多少字符没有转换
  40. *@param tempoutbuf 存放转换后的字符串
  41. *@param outlen 存放转换后,tempoutbuf剩余的空间
  42. *
  43. * */
  44. size_t ret = iconv (cd, &tmpin, inlen, &tmpout, outlen);
  45. )
  46. {
  47. perror ("iconv");
  48. }
  49.  
  50. /* 存放转换后的字符串 */
  51. printf("outbuf=%s\n", outbuf);
  52.  
  53. //存放转换后outbuf剩余的空间
  54. printf("outlen=%d\n", *outlen);
  55.  
  56. ;
  57. ; i<(outsize- (*outlen)); i++)
  58. {
  59. //printf("%2c", outbuf[i]);
  60. printf("%x\n", outbuf[i]);
  61. }
  62.  
  63. /* 关闭句柄 */
  64. iconv_close (cd);
  65.  
  66. ;
  67. }
  68.  
  69. bool utf8_to_unicode (char *inbuf, size_t *inlen, char *outbuf, size_t *outlen)
  70. {
  71.  
  72. /* 目的编码, TRANSLIT:遇到无法转换的字符就找相近字符替换
  73. * IGNORE :遇到无法转换字符跳过*/
  74. char *encTo = "UNICODE//IGNORE";
  75. /* 源编码 */
  76. char *encFrom = "UTF-8";
  77.  
  78. /* 获得转换句柄
  79. *@param encTo 目标编码方式
  80. *@param encFrom 源编码方式
  81. * */
  82. iconv_t cd = iconv_open (encTo, encFrom);
  83. )
  84. {
  85. perror ("iconv_open");
  86. }
  87.  
  88. /* 需要转换的字符串 */
  89. printf("inbuf=%s\n", inbuf);
  90.  
  91. /* 打印需要转换的字符串的长度 */
  92. printf("inlen=%d\n", *inlen);
  93.  
  94. /* 由于iconv()函数会修改指针,所以要保存源指针 */
  95. char *tmpin = inbuf;
  96. char *tmpout = outbuf;
  97. size_t insize = *inlen;
  98. size_t outsize = *outlen;
  99.  
  100. /* 进行转换
  101. *@param cd iconv_open()产生的句柄
  102. *@param srcstart 需要转换的字符串
  103. *@param inlen 存放还有多少字符没有转换
  104. *@param tempoutbuf 存放转换后的字符串
  105. *@param outlen 存放转换后,tempoutbuf剩余的空间
  106. *
  107. * */
  108. size_t ret = iconv (cd, &tmpin, inlen, &tmpout, outlen);
  109. )
  110. {
  111. perror ("iconv");
  112. }
  113.  
  114. /* 存放转换后的字符串 */
  115. printf("outbuf=%s\n", outbuf);
  116.  
  117. //存放转换后outbuf剩余的空间
  118. printf("outlen=%d\n", *outlen);
  119.  
  120. ;
  121. ; i<(outsize- (*outlen)); i++)
  122. {
  123. //printf("%2c", outbuf[i]);
  124. printf("%x\n", outbuf[i]);
  125. }
  126.  
  127. /* 关闭句柄 */
  128. iconv_close (cd);
  129.  
  130. ;
  131. }
  132.  
  133. int main ()
  134. {
  135. /* 需要转换的字符串 */
  136. char *text = "这是需要转换的字符串";
  137.  
  138. ] = {};
  139. strcpy (inbuf, text);
  140. size_t inlen = strlen (inbuf);
  141.  
  142. /* 存放转换后的字符串 */
  143. ] = {};
  144. size_t outlen = ;
  145.  
  146. utf8_to_unicode (inbuf, &inlen, outbuf, &outlen);
  147. printf ("print outbuf: %s\n", outbuf);
  148.  
  149. size_t outsize = strlen(outbuf);
  150. size_t insize = ;
  151. ] = {};
  152. unicode_to_utf8 (outbuf, &outsize, instr, &insize);
  153. printf ("print buf: %s\n", instr);
  154. ;
  155. }

iconv字符转换的更多相关文章

  1. C++用iconv进行页面字符转换

    在对HTML页面进行爬取时,总会遇到一些不同的编码,而我们通常都不会一一对这些编码进行处理,而是集体转换成相同的编码,也易于装入数据库.此时,iconv便成为一个很方便的工具. iconv 头文件&q ...

  2. iconv简介(1、字符串|文件字符转换:iconv用于将一种已知的字符集文件转换成另一种已知的字符集文件)(2、编程语言函数功能的相似性:iconv不仅再php中有用,而且c语言中也有用,还有linux等)

    iconv简介(1.字符串|文件字符转换:iconv用于将一种已知的字符集文件转换成另一种已知的字符集文件)(2.编程语言函数功能的相似性:iconv不仅再php中有用,而且c语言中也有用,还有lin ...

  3. PHP iconv()编码转换函数用法示例

    PHP iconv()字符编码转换函数的用法,iconv()函数,在php5中是内置的,语法格式:iconv("UTF- 8","GB2312//IGNORE" ...

  4. 用linux的iconv函数 转换编码

    inux shell 配置文件中默认的字符集编码为UTF-8 .UTF-8是unicode的一种表达方式,gb2312是和unicode都是字符的编码方式,所以说gb2312跟utf-8的概念应该不是 ...

  5. php iconv函数转换出错问题

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  6. 【JavaScript】JS 中 原始字符串 和 HTML 字符转换

    参考资料:http://www.sjyhome.com/javascript/js-html-escape.html JS转换HTML转义符 SJY • 发表于:2013年10月05日 17:04 • ...

  7. 带毫秒的字符转换成时间(DateTime)格式的通用方法

    C#自身有更好的方式,Net任意String格式转换为DateTime类型 ====================================================== 原文 ==== ...

  8. sql字符转换函数大全

    删除空格 有两个函数,TTRIM()和LTRIM(),可以用来从字符串中剪掉空格.函数LTRIM()去除应该字符串前面的所有空格:函数RTRIM()去除一个字符串尾部的所有空格.这些和vbscript ...

  9. python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理

    python_way,day3 一.集合 二.函数 三.三元运算 四.lambda 五.python的内置函数 六.字符转换 七.文件处理 一.集合: 1.集合的特性: 特性:无序,不重复的序列 如果 ...

随机推荐

  1. Ubuntu安装SSH + Windows上配置Putty

    1. Ubuntu安装SSH 命令: # sudo apt-get install openssh-server 2. 启动SSH Server 命令: # sudo /etc/init.d/ssh ...

  2. web框架详解之 tornado 四 模板引擎、session、验证码、xss

    一.模板引擎 基本使用 继承,extends 页面整体布局用继承 导入,include 如果是小组件等重复的那么就用导入 下面是目录 首先在controllers里面创建一个文件,文件里面是页面类 # ...

  3. Fermat’s Chirstmas Theorem (素数打表的)

                                                                             Fermat’s Chirstmas Theorem ...

  4. 使用JobControl控制MapReduce任务

    代码结构 BeanWritable:往数据库读写使用的bean ControlJobTest:JobControl任务控制 DBInputFormatApp:将关系型数据库的数据导入HDFS,其中包含 ...

  5. 京东自营,你TM太坑了。

    双12来了,京东自营好坑.昨天(12月6日)看的一条秋裤,89元,今天准备买,居然涨到了119,他大爷的. 京东你大爷的.

  6. JS多项选择删除

    $(document).ready(function(){ $("#batdel").click(function(){ var checkedLen = 0; var check ...

  7. hdu3572线性欧拉筛

    用线性筛来筛,复杂度O(n) #include<bits/stdc++.h> #include<ext/rope> #define fi first #define se se ...

  8. hdu 1003 Max Sum(基础dp)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  9. jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别

    http://www.poluoluo.com/jzxy/201312/253059.html 在这个sprint中,因为要写前端UI,所以用到了jQuery,但是jQuery在向上遍历DOM树的AP ...

  10. JavaUtil_02_二维码的生成与解析

    1.引入jar包 zxing-core-1.7.jar  :   http://viralpatel.net/blogs/download/jar/zxing-core-1.7.jar zxing-j ...