您的位置:首页 > 运维架构 > Linux

[Linux系统编程]将GBK转换成UTF-8

2015-01-16 15:59 639 查看

1.编码简单介绍

Windows下的中文一般都为GBK或者GB2312编码,而Linux下默认采用UTF-8编码,因为编码的不同就会导致乱码。
对于GBK/GB2312来说,一个中文字是占两个字节;对于UFT-8来说,一个中文字是占三个字节。
GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码;GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名。

2.编码转换方法

Linux下通过iconv_open, iconv, iconv_close三个函数即可完成编码的转化。

3.相关函数函数原型

iconv_open
#include <iconv.h>

iconv_t iconv_open(
const char *tocode, /* 目标编码字符串,比如:"UTF-8" */
const char *fromcode /* 源编码字符串,比如:"GBK" */
);

/*
返回值:
成功返回一个转换描述符,失败返回(iconv_t)-1。(这里相当于一个强转)

*/

iconv
#include <iconv.h>

size_t iconv(iconv_t cd, // 通过iconv_open函数返回的转换描述符
char **inbuf, // 输入缓存的地址
size_t *inbytesleft, // 输入缓存的大小
char **outbuf, // 输出缓存的地址
size_t *outbytesleft //输出缓存的大小
);

/*
返回值:
成功返回转换的字符数,失败返回(size_t)-1。(这里相当于一个强转)

*/

iconv_close
#include <iconv.h>

int iconv_close(
iconv_t cd // 通过iconv_open函数返回的转换描述符
);

/*
返回值:
成功返回0,失败返回-1。

*/


4.示例代码

Linux下转换windows下写的一个txt文本文件,转换编码之后,在终端打印出来。
#include <stdio.h>
#include <iconv.h>
#include <string.h>
#include <errno.h>

int gbk2utf8(char *src, size_t *srclen, char *dest, size_t *destlen)
{
iconv_t cd = iconv_open("UTF-8", "GBK");

if (cd == (iconv_t)-1) {
printf("func iconv_open() err : %s\n", strerror(errno));
return -1;
}

size_t rc = iconv(cd, &src, srclen, &dest, destlen);

if (rc == (size_t)-1) {
printf("func iconv() err : %s\n", strerror(errno));
return -1;
}

iconv_close(cd);

return 0;
}

int main(int argc, char *argv[])
{
if (argc < 2)
return -1;

FILE *fp = fopen(argv[1], "r");

if (fp == NULL) {
printf("func fopen() err : %s\n", strerror(errno));
return -2;
}

char buf[1024];
char destbuf[1024];

while (1) {
memset(buf, 0, sizeof(buf));
memset(destbuf, 0, sizeof(destbuf));

if (fgets(buf, sizeof(buf), fp) == NULL) {
break;
}

size_t srclen = strlen(buf);
size_t destlen = sizeof(destbuf);

gbk2utf8(buf, &srclen, destbuf, &destlen);

printf("%s", destbuf);
}

fclose(fp);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: