iconv命令實現linux下字符集編碼的轉換
1.iconv命令用法如下:
2.iconv函數:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函數說明將要進行哪兩種編碼的轉換,tocode是目標編碼,fromcode是原編碼,該函數返回一個轉換句柄,供以下兩個函數使用。
詳細說明:http://linux.die.net/man/3/iconv_open
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函數從inbuf中讀取字符,轉換后輸出到outbuf中,inbytesleft用以記錄還未轉換的字符數,outbytesleft用以記錄輸出緩沖的剩余空間。
詳細說明:http://pubs.opengroup.org/onlinepubs/009695399/functions/iconv.html
大部分情形是inbuf 不為NULL,*inbuf也不為NULL。這種情況下,iconv函數將以*inbuf起始的多字節序列轉換到以*outbuf起始的多字節序列。從*inbuf開始讀取,最多*inbytesleft字節,轉換后,從*outbuf開始寫入,最多*outbytesleft字節。
iconv函數一次轉換一個多字節字符,每次字符轉換,*inbuf增加已轉換的字節數,*inbytesleft相應地減少已轉換的字節數;對應地,*outbuf和*outbytesleft作相應的修改,同時修改cd的轉換狀態,因此,相應的操作要針對其副本。
以下四種情況不能完成轉換:
1.輸入中含無效的多字節序列。此時,它將errno設置為EILSEQ並返回(size_t)(-1)。*inbuf指向無效序列的最左端。
2.輸入的字節序列已經全部被轉換過,也就是*inbytesleft減少至0。此時,iconv返回本次調用中完成轉換的數目(可逆的轉換不計入)。
3.輸入中以不完整多字節序列作結尾。此時,它將errno設置為EINVAL並返回(size_t)(-1)。*inbuf指向不完整多字節序列的最左端。
4.輸出緩存區沒有足夠空間來存儲下一個字符。此時,它將errno設置為E2BIG並返回(size_t)(-1)。
另一種情形是inbuf 為NULL或*inbuf為NULL,但*outbuf 不為NULL,*outbuf也不為NULL。這種情況下,iconv函數試圖將cd的轉換狀態設置為初始狀態並store a corresponding shift sequence at *outbuf。從*outbuf開始,最多寫入*outbytesleft字節。如果輸出緩存區沒有足夠空間來存儲這個重置后的序列,他將errno設置為E2BIG並返回(size_t)(-1)。反之,*outbuf增加寫入的字節數和*outbytesleft減少寫入的字節數。
第三種情形是inbuf 為NULL或*inbuf為NULL,*outbuf 為NULL或*outbuf為NULL。這種情況下,iconv函數試圖將cd的轉換狀態設置為初始狀態。
返回值:
iconv函數返回本次調用中轉換的字符數,可逆的轉換不計入。出錯時,它將修改errno並返回(size_t)(-1)。
錯誤:
E2BIG *outbuf沒有足夠的空間。
EILSEQ 輸入含無效的多字節序列。
EINVAL 輸入含不完整多字節序列。
(3) int iconv_close(iconv_t cd);
此函數用於關閉轉換句柄,釋放資源。
c代碼示例
//將utf-8轉為gb2312,代碼僅供參考。
iconv_t cd; char src_utf8[20]="utf8編碼"; char *inbuf=src_utf8; int inen=strlen(inbuf); int outlen=255; char *outbuf=(char *)malloc(outlen); cd=iconv_open("gb2312","utf-8"); iconv(cd,&inbuf,(size_t *)&inlen,&outbuf,&outlen); printf("%s\n",outbuf); iconv_close(cd); free(outbuf);