iconv Linux下编码转换
知识标签:linux, iconv, 编码
有时程序运行时会用到编码转换,这时就用到iconv的3个函数
特写了一个测试小代码以作备忘
iconv3个函数原型
iconv_t iconv_open(const char *tocode, const char *fromcode);
size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
int iconv_close(iconv_t cd);
code
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<iconv.h>
void convert(char* left, size_t sizeleft, char* right, size_t sizeright)
{
printf("left: %s\n", left);
printf("rightleft: %ld\n", sizeleft);
printf("right: %s\n", right);
printf("sizeright: %ld\n", sizeright);
printf("--------------------------\n");
iconv_t cd = iconv_open("gbk", "utf-8");
if((iconv_t)-1 == cd)
{
std::cout << "cd error !" << std::endl;
return;
}
iconv(cd, (char**)&left, (size_t*)&sizeleft, (char**)&right, (size_t*)&sizeright);
printf("left: %s\n", left);
printf("rightleft: %ld\n", sizeleft);
printf("right: %s\n", right);
printf("sizeright: %ld\n", sizeright);
iconv_close(cd);
}
int main(void)
{
char buf[1024];
size_t size_buf = sizeof(buf);
//字符串一定要初始化为0,养成习惯,否则总是出现莫名错误
memset(buf, 0, size_buf);
strcpy(buf, "星期二我是中国人hello");
size_t len_buf = strlen(buf);
char buf2[1024];
size_t size_buf2 = sizeof(buf2);
memset(buf2, 0, size_buf2);
//第二参数应该是缓存区的大小,不应该是缓存区中字符长度
//应该是size_buf,不应该是len_buf
convert(buf, size_buf, buf2, size_buf2);
return 0;
}
结果
终端编码设置为utf-8
的结果:
终端编码设置为gbk
的结果:
总结
- buf一定要
memset(buf, 0, sizeof(buf))
- size_buf一定要是
缓存区的大小
,不应该是缓存区中字符长度
- 三步:1.
iconv_open
获取描述符 2.iconv
转码 3.iconv_close
关闭描述符- iconv转码后转码的结果保存在
buf
里面,而不是buf2