解決辦法:
tmpbuf=tmpbuff; 轉(zhuǎn)碼前,標記轉(zhuǎn)碼內(nèi)容首地址
linux下c語言利用iconv函數(shù)實現(xiàn)utf-8轉(zhuǎn)unicode,iconv是linux下的編碼轉(zhuǎn)換的工具,它提供命令行的使用和函數(shù)接口支持。
iconv函數(shù)族的頭文件是iconv.h,使用前需包含
#include <iconv.h>
iconv函數(shù)族有三個函數(shù),原型如下:
函數(shù)1:
iconv_t iconv_open(const char *tocode, const char *fromcode);
此函數(shù)說明將要進行哪兩種編碼的轉(zhuǎn)換,tocode是目標編碼,fromcode是原編碼,該函數(shù)返回一個轉(zhuǎn)換句柄,供以下兩個函數(shù)使用。
函數(shù)2:
size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函數(shù)從inbuf中讀取字符,轉(zhuǎn)換后輸出到outbuf中,inbytesleft用以記錄還未轉(zhuǎn)換的字符數(shù),outbytesleft用以記錄輸出緩沖的剩余空間。
注意:inbuf和outbuf都必須是有存儲空間的不能定義為常量,如:char *inbuf = "abc" 或者是char *outbuf = "123"這樣定義都是錯誤的??梢詍alloc申請空間,或者char outbuff[64]=“”。(另外inbuf,inbytesleft,outbuf,outbytesleft這幾個參數(shù)在使用過程中都會改變,最好是先保存一下原值,然后再使用。)
要想知道轉(zhuǎn)換編碼后的string的首地址,需要先保存編碼轉(zhuǎn)換前string的首地址,tmpbuf=tmpbuff; 使用過程tmpbuff首地址會丟失;
需要知道轉(zhuǎn)換后的編碼長度值outbytesleft,outbytesleft=maxlen-outbytesleft;這里maxlen=2*strlen(inbuf);inbuf轉(zhuǎn)碼前。
函數(shù)3:
int iconv_close(iconv_t cd);
此函數(shù)用于關(guān)閉轉(zhuǎn)換句柄,釋放資源。