C中编码问题
编码介绍
在代码中我们通常不可避免的出现一些中文,这个时候我们就要考虑到中文的编码格式,如果不注意可能会导致乱码或者信息失真等问题。我们常用的中文编码有GBK,gb2312,Unicode等等。具体详细的介绍看下面几篇文章:
- http://www.cnblogs.com/lizhenghn/p/3690406.html
- http://docs.linuxtone.org/ebooks/C&CPP/c/apas03.html
C语言编码转换
在C语言中,如果需要讲编码进行转换,可以使用iconv系列函数。
头文件以及常用函数:
|
|
iconv_open
函数说明
此函数说明将要进行哪两种编码的转换,并返回一个转化句柄。
参数说明
- tocode:目标编码
- fromcode : 原编码
iconv
|
|
函数说明
此函数用于从inbuf中读取数据并将转换到指定编码的的数据输出到outbuf中,若转换成功,则输出本次转化的字节数,否则返回sizeof_t(-1)
参数说明
- cd : 转换描述符,由iconv_open获得
- inbuf:输入缓冲区
- in_left_buf :输入缓冲区还未转换的字符数
- outbuf : 输出缓冲区
- out_len_buf:输出缓冲区的剩余空间.
iconv_close
|
|
用于关闭iconv_open打开的文件描述符
举例转换函数
|
|
iconv函数出现段错误的原因
使用iconv函数进行转换的时候可能会出现段错误,这里出现这个错误的主要原因是注意看iconv函数的函数原型:
长度为size_t的指针,int指针转换为size_t指针在一些系统的转换过程会出现问题,导致长度出现错误,内存越界,出现段错误。错误信息如下:
|
|
size_t与int类型
size_t类型是在stddef.h文件中定义。size_t的类型与操作系统相关,在32位架构中被普遍定义为:
在64为机器中被定义为:
int类型在32和64为机器上的长度都是4位,long在32位机器为4位,在64位机器为8位。所以在64为机器上,size_t和int指针转换的过程中一定会出现问题,在32为系统中的正整数指针不会指针,但是负整数也会出现问题。