libiconv编程API
2016-04-03 15:39
183 查看
在Linux上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现(针对文件进行转换)
一、利用iconv函数族进行编码转换
iconv函数族的头文件是iconv.h
使用前需包含之:#include <iconv.h>
iconv函数族有三个函数,原型如下:
(1) iconv_open()
函数原型:
iconv_t iconv_open(const char *tocode, const char *fromcode);
函数功能:
该函数分配一个编码转换句柄
参数:
1> tocode是目标编码
2> fromcode是原编码
(具体可以使用的编码方案可以百度查找)
支持的内码包括:Unicode相关编码,如UTF-8、UTF-16等等;各国采用的ANSI编码,其中包括GB2312、BIG5等中文编码方式。
返回值:
调用成功,则该函数返回一个转换句柄,供以下两个函数使用;
调用失败,返回-1,并且设置errno
可能的错误类型:
EINVAL The conversion from fromcode to tocode is not supported by the implementation.
(2) iconv()
函数功能:进行实际的编码转换
函数原型:
size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
参数介绍:
1> cd是方法iconv_open()调用返回的转码句柄;
2> inbuf指向需要转码的缓冲区;
3> inbytesleft是inbuf所保存的需要转码的字节数;
4> outbuf存放转码结果;
5> outbytesleft存放outbuf空间的大小。
(不足之处:由于没有办法获取转换之后需要的内存大小,所以会造成内存空间的浪费!)
返回值:
调用成功,返回转换的字节数(不可逆转调用的字节数,可逆转调用的字节数不包括在内)
调用失败,返回-1,并设置相应的errno。
注意:
iconv()是逐步扫描inbuf,每转换一个字符,就增加inbuf,减少inbytesleft,并将结果存入outbuf,结果字节数存入outbytesleft
常见的三种情况:
情况一: inbuf不为空,而且*inbuf也不为空
此时,进行正常的编码转换
遇到下列情况将停止扫描并返回:
(1)inbuf中碰到非法的多字节序
这种状况下,会设置errno为EILSEQ,并返回-1;
(2)inbuf字节被完全转换
这种状况下,返回转换的字节数
(3)inbuf中碰到不完整的多字节序
这种状况下,设置errno为EINVAL,并返回-1;
(4)outbuf中没有足够的空间以进行下一次的字符转换
这种状况下,设置errno为E2BIG,并返回-1;
情况二:inbuf == NULL,或者*inbuf == NULL;但outbuf != NULL,且*outbuf != NULL
iconv会设置转换状态为初始状态,并保存转换序列到*outbuf。如果outbuf空间不足,errno会设置为E2BIG,返回(size_t) (-1);
情况三:INBUF == NULL,或者*inbuf == NULL; 并且outbuf == NULL,*out == NULL
iconv设置转换状态为初始状态
(3) iconv_close()
函数原型:
int iconv_close(iconv_t cd);
函数功能:
此函数用于关闭转换句柄,释放资源。
一、利用iconv函数族进行编码转换
iconv函数族的头文件是iconv.h
使用前需包含之:#include <iconv.h>
iconv函数族有三个函数,原型如下:
(1) iconv_open()
函数原型:
iconv_t iconv_open(const char *tocode, const char *fromcode);
函数功能:
该函数分配一个编码转换句柄
参数:
1> tocode是目标编码
2> fromcode是原编码
(具体可以使用的编码方案可以百度查找)
支持的内码包括:Unicode相关编码,如UTF-8、UTF-16等等;各国采用的ANSI编码,其中包括GB2312、BIG5等中文编码方式。
返回值:
调用成功,则该函数返回一个转换句柄,供以下两个函数使用;
调用失败,返回-1,并且设置errno
可能的错误类型:
EINVAL The conversion from fromcode to tocode is not supported by the implementation.
(2) iconv()
函数功能:进行实际的编码转换
函数原型:
size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
参数介绍:
1> cd是方法iconv_open()调用返回的转码句柄;
2> inbuf指向需要转码的缓冲区;
3> inbytesleft是inbuf所保存的需要转码的字节数;
4> outbuf存放转码结果;
5> outbytesleft存放outbuf空间的大小。
(不足之处:由于没有办法获取转换之后需要的内存大小,所以会造成内存空间的浪费!)
返回值:
调用成功,返回转换的字节数(不可逆转调用的字节数,可逆转调用的字节数不包括在内)
调用失败,返回-1,并设置相应的errno。
注意:
iconv()是逐步扫描inbuf,每转换一个字符,就增加inbuf,减少inbytesleft,并将结果存入outbuf,结果字节数存入outbytesleft
常见的三种情况:
情况一: inbuf不为空,而且*inbuf也不为空
此时,进行正常的编码转换
遇到下列情况将停止扫描并返回:
(1)inbuf中碰到非法的多字节序
这种状况下,会设置errno为EILSEQ,并返回-1;
(2)inbuf字节被完全转换
这种状况下,返回转换的字节数
(3)inbuf中碰到不完整的多字节序
这种状况下,设置errno为EINVAL,并返回-1;
(4)outbuf中没有足够的空间以进行下一次的字符转换
这种状况下,设置errno为E2BIG,并返回-1;
情况二:inbuf == NULL,或者*inbuf == NULL;但outbuf != NULL,且*outbuf != NULL
iconv会设置转换状态为初始状态,并保存转换序列到*outbuf。如果outbuf空间不足,errno会设置为E2BIG,返回(size_t) (-1);
情况三:INBUF == NULL,或者*inbuf == NULL; 并且outbuf == NULL,*out == NULL
iconv设置转换状态为初始状态
(3) iconv_close()
函数原型:
int iconv_close(iconv_t cd);
函数功能:
此函数用于关闭转换句柄,释放资源。
相关文章推荐
- AQS(4):condition
- AQS(3):release
- 如何利用线程的生命周期使小球撞墙弹回
- implode() 和 explode()
- spring MVC配置form支持PUT和DELETE方法
- Java 时间格式转换
- AQS(1):引言
- Java并发:线程间同步机制:条件队列和同步工具类
- 通过JavaCompiler动态编译和运行
- PHP安装编译错误及解决办法
- JPA hibernate spring repository pgsql java 工程(四):分页查询
- Java 正则表达式
- 蓝桥杯 格子刷油漆(Java实现)
- putty mtputty 设置utf8编码
- C语言(三眼怪物)
- 《深入理解java虚拟机》笔记——简析java类文件结构
- 20145324 《Java程序设计》第5周学习总结
- PHP上传文件到指定目录(Zend Studio 12.5)
- 浅谈Java SE、Java EE、Java ME三者的区别
- Ubuntu系统中jdk的安装及配置方法