欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
利用iconv實(shí)現字符編碼轉換

http://blog.sina.com.cn/s/blog_6a1837e90100uf9t.html

2011

利用iconv實(shí)現字符編碼轉換:


int convert

(

  const char*from,       
  const char*to,        
  char*save,            
  intsavelen,           
  char*src,             
  intsrclen)            
{
 iconv_t cd;
 char *inbuf = src;
 char *outbuf = save;
 size_t outbufsize = savelen;
 int status = 0;
 size_t savesize = 0;
 size_t inbufsize = srclen;
 char* inptr = inbuf;
 size_t insize = inbufsize;
 char* outptr = outbuf;
 size_t outsize = outbufsize;

 cd = iconv_open(to, from);
 iconv(cd,NULL,NULL,NULL,NULL);
 if (inbufsize == 0)

 {
   status = -1;
   goto done;
 }
 while (insize > 0)

{
  size_t res =iconv(cd,&inptr,&insize,&outptr,&outsize);
  if (res == (size_t)(-1))

  {
   if (errno ==EILSEQ) {
    inptr++;
    status= -3;
   }

   else if(errno == EINVAL)

   {
    break;
   }

   else if(errno == E2BIG)

  {
    status= -5;
    gotodone;
   }

   else

   {
    status= -6;
    gotodone;
   }
  }
 }
 if (outptr != outbuf)

{
  int outsize = outptr -outbuf;
  strncpy(save+savesize, outbuf,outsize);
 }
 status = strlen(save);

done:
 iconv_close(cd);
 return status;
}
使用方法:
gchar *convert(gchar *from)
{
 char *result = g_new(char, strlen(from) * 3 +1);
 convert2("GBK", "UTF-8", result, strlen(from) * 3+ 1, from, strlen(from));
 if (result != NULL) return result;
 else return "";
}


PS:iconv參考說(shuō)明:

iconv函數族的頭文件是iconv.h,使用前需包含之。

    #include

iconv函數族有三個(gè)函數,原型如下:

    (1)iconv_t iconv_open(const char*tocode,const char *fromcode);

    此函數說(shuō)明將要進(jìn)行哪兩種編碼的轉換,tocode是目標編碼,fromcode是原編碼,該函數返回一個(gè)轉換句柄,供以下兩個(gè)函數使用。

    (2)size_t iconv(iconv_t cd,char**inbuf,size_t *inbytesleft,char **outbuf,size_t*outbytesleft);

    此函數從inbuf中讀取字符,轉換后輸出到outbuf中,inbytesleft用以記錄還未轉換的字符數,outbytesleft用以記錄輸出緩沖的剩余空間。

參數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

   輸入含無(wú)效的多字節序列。

EINVAL

   輸入含不完整多字節序列。

   (3)int iconv_close(iconv_t cd);

   此函數用于關(guān)閉轉換句柄,釋放資源。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux下轉換字符集(UTF8轉換)
Linux兩個(gè)函數mbstowcs() 與wcstombs()
怎樣學(xué)習使用libiconv庫 - My Study
iconv使用
iconv 文件編碼轉換
iconv實(shí)現通用語(yǔ)言編碼轉換|iconv,通用,語(yǔ)言,編碼轉換
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久