iconv字符转换
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);
此函数用于关闭转换句柄,释放资源。
#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); ) { 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); ) { perror ("iconv"); } /* 存放转换后的字符串 */ printf("outbuf=%s\n", outbuf); //存放转换后outbuf剩余的空间 printf("outlen=%d\n", *outlen); ; ; i<(outsize- (*outlen)); i++) { //printf("%2c", outbuf[i]); printf("%x\n", outbuf[i]); } /* 关闭句柄 */ iconv_close (cd); ; } 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); ) { 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); ) { perror ("iconv"); } /* 存放转换后的字符串 */ printf("outbuf=%s\n", outbuf); //存放转换后outbuf剩余的空间 printf("outlen=%d\n", *outlen); ; ; i<(outsize- (*outlen)); i++) { //printf("%2c", outbuf[i]); printf("%x\n", outbuf[i]); } /* 关闭句柄 */ iconv_close (cd); ; } int main () { /* 需要转换的字符串 */ char *text = "这是需要转换的字符串"; ] = {}; strcpy (inbuf, text); size_t inlen = strlen (inbuf); /* 存放转换后的字符串 */ ] = {}; size_t outlen = ; utf8_to_unicode (inbuf, &inlen, outbuf, &outlen); printf ("print outbuf: %s\n", outbuf); size_t outsize = strlen(outbuf); size_t insize = ; ] = {}; unicode_to_utf8 (outbuf, &outsize, instr, &insize); printf ("print buf: %s\n", instr); ; }
iconv字符转换的更多相关文章
- C++用iconv进行页面字符转换
在对HTML页面进行爬取时,总会遇到一些不同的编码,而我们通常都不会一一对这些编码进行处理,而是集体转换成相同的编码,也易于装入数据库.此时,iconv便成为一个很方便的工具. iconv 头文件&q ...
- iconv简介(1、字符串|文件字符转换:iconv用于将一种已知的字符集文件转换成另一种已知的字符集文件)(2、编程语言函数功能的相似性:iconv不仅再php中有用,而且c语言中也有用,还有linux等)
iconv简介(1.字符串|文件字符转换:iconv用于将一种已知的字符集文件转换成另一种已知的字符集文件)(2.编程语言函数功能的相似性:iconv不仅再php中有用,而且c语言中也有用,还有lin ...
- PHP iconv()编码转换函数用法示例
PHP iconv()字符编码转换函数的用法,iconv()函数,在php5中是内置的,语法格式:iconv("UTF- 8","GB2312//IGNORE" ...
- 用linux的iconv函数 转换编码
inux shell 配置文件中默认的字符集编码为UTF-8 .UTF-8是unicode的一种表达方式,gb2312是和unicode都是字符的编码方式,所以说gb2312跟utf-8的概念应该不是 ...
- php iconv函数转换出错问题
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...
- 【JavaScript】JS 中 原始字符串 和 HTML 字符转换
参考资料:http://www.sjyhome.com/javascript/js-html-escape.html JS转换HTML转义符 SJY • 发表于:2013年10月05日 17:04 • ...
- 带毫秒的字符转换成时间(DateTime)格式的通用方法
C#自身有更好的方式,Net任意String格式转换为DateTime类型 ====================================================== 原文 ==== ...
- sql字符转换函数大全
删除空格 有两个函数,TTRIM()和LTRIM(),可以用来从字符串中剪掉空格.函数LTRIM()去除应该字符串前面的所有空格:函数RTRIM()去除一个字符串尾部的所有空格.这些和vbscript ...
- python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理
python_way,day3 一.集合 二.函数 三.三元运算 四.lambda 五.python的内置函数 六.字符转换 七.文件处理 一.集合: 1.集合的特性: 特性:无序,不重复的序列 如果 ...
随机推荐
- Django——auth用户认证
之前我们在进行用户校验的时候,总是从数据库中获取数据,然后再进行对比,就像如下这样: def login(request): if request.method == "POST" ...
- 3.22课·········CSS样式表
CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/ 此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控 ...
- mutation与action
mutation 作用: 更改state的状态 说明: 每个mutation对象都有字符串类型(type)与回调函数,在回调函数内进行状态修改,回调函数的第一个参数为state eg: mutatio ...
- 第二十二篇、IO多路复用 一
一.简介io多路复用 可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,就会感知到 Linux中的 select,poll,epoll(内核2.6以上) 都是IO多路复用的 ...
- C++(二)— STL容器的基本用法
1.vector基本操作 关于vector简单的讲就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下的时候会自动申请一片更大的空间(空间配置器)将原来的数据拷贝到新的空间,然后 ...
- hdu 2955 Robberies(01背包)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- http接口测试框架-python
简单分解一下 接口测试框架设计: 主入口 -> 遍历接口/用例 -> 发送请求+接收响应 ->结果的对比 -> 生成报告 ->发送email 分成几大类:主入口的py文件 ...
- python-socket1
如何理解socket编程 就是两个进程,跨计算机,他俩需要通讯的话,需要通过网络对接起来.这就是 socket 的作用.打个比方吧,两个进程在两个计算机上,需要有一个进程做被动方,叫做服务器.另一个做 ...
- os.path
- 【二叉查找树】02不同的二叉查找树个数II【Unique Binary Search Trees II】
提到二叉查找树,就得想到二叉查找树的递归定义, 左子树的节点值都小于根节点,右子树的节点值都大于根节点. +++++++++++++++++++++++++++++++++++++++++++++++ ...