http://blog.sina.com.cn/s/blog_6a1837e90100uf9t.html
2011
利用iconv實(shí)現字符編碼轉換:
int convert
(
{
{
{
done:
}
使用方法:
gchar *convert(gchar *from)
{
}
PS:iconv參考說(shuō)明:
iconv函數族的頭文件是iconv.h,使用前需包含之。
iconv函數族有三個(gè)函數,原型如下:
參數cd必須是由iconv_open函數創(chuàng )建的轉換描述符。
大部分情形是inbuf不為NULL,*inbuf也不為NULL。這種情況下,iconv函數將以*inbuf起始的多字節序列轉換到以*outbuf起始的多字節序列。從*inbuf開(kāi)始讀取,最多*inbytesleft字節,轉換后,從*outbuf開(kāi)始寫(xiě)入,最多*outbytesleft字節。
iconv函數一次轉換一個(gè)多字節字符,每次字符轉換,*inbuf增加已轉換的字節數,*inbytesleft相應地減少已轉換的字節數;對應地,*outbuf和*outbytesleft作相應的修改,同時(shí)修改cd的轉換狀態(tài)。
以下四種情況不能完成轉換:
1.輸入中含無(wú)效的多字節序列。此時(shí),它將errno設置為EILSEQ并返回(size_t)(-1)。*inbuf指向無(wú)效序列的最左端。
2.輸入的字節序列已經(jīng)全部被轉換過(guò),也就是*inbytesleft減少至0。此時(shí),iconv返回本次調用中完成轉換的數目(可逆的轉換不計入)。
3.輸入中以不完整多字節序列作結尾。此時(shí),它將errno設置為EINVAL并返回(size_t)(-1)。*inbuf指向不完整多字節序列的最左端。
4.輸出緩存區沒(méi)有足夠空間來(lái)存儲下一個(gè)字符。此時(shí),它將errno設置為E2BIG并返回(size_t)(-1)。
另一種情形是inbuf 為NULL或*inbuf為NULL,但*outbuf不為NULL,*outbuf也不為NULL。這種情況下,iconv函數試圖將cd的轉換狀態(tài)設置為初始狀態(tài)并store acorresponding shift sequence at*outbuf。從*outbuf開(kāi)始,最多寫(xiě)入*outbytesleft字節。如果輸出緩存區沒(méi)有足夠空間來(lái)存儲這個(gè)重置后的序列,他將errno設置為E2BIG并返回(size_t)(-1)。反之,*outbuf增加寫(xiě)入的字節數和*outbytesleft減少寫(xiě)入的字節數。
第三種情形是inbuf 為NULL或*inbuf為NULL,*outbuf為NULL或*outbuf為NULL。這種情況下,iconv函數試圖將cd的轉換狀態(tài)設置為初始狀態(tài)。
返回值
iconv函數返回本次調用中轉換的字符數,可逆的轉換不計入。出錯時(shí),它將修改errno并返回(size_t)(-1)。
錯誤
除了其它錯誤以外,出現以下錯誤:
E2BIG
*outbuf沒(méi)有足夠的空間。
EILSEQ
EINVAL
聯(lián)系客服