linux下使用libiconv庫轉碼


iconv命令實現linux下字符集編碼的轉換  

windows下的文件復制到linux下時常會亂碼,因為windows下文件編碼為GBK,linux下默認文件編碼為UTF-8,故需要libiconv庫轉碼。

1.iconv命令用法如下:

iconv [選項...] [文件...]
 
輸入/輸出格式規范:
-f, --from-code=名稱 原始文本編碼
-t, --to-code=名稱 輸出編碼
 
信息:
-l, --list 列舉所有已知的字符集
 
輸出控制:
-c 從輸出中忽略無效的字符
-o, --output=FILE 輸出文件
-s, --silent 關閉警告
--verbose 打印進度信息
 
將GBK編碼的文件Hosts_GBK轉換為UTF-8編碼的HOSTS_UTF8.
示例如下:
iconv -f GBK -t UTF-8 Hosts_GBK > HOSTS_UTF8
 

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);


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM