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