在Linux下寫C程序,尤其是網絡通信程序時經常遇到編碼轉換的問題,這里要用到iconv函數庫。
iconv函數庫有以下三個函數
1 |
|
這三個函數的功能顯而易見,分別是打開一個iconv_t句柄,轉換字符串以及關閉一個iconv_t句柄。其中有必要一說的是iconv函數,這個函數十分容易用錯。
iconv函數的五個參數中,第一個參數是iconv句柄,第二、三個參數是需要轉換的字符串的地址和長度的地址,第四、五個參數是存儲結果的字符串的地址和長度的地址,注意這里傳的都是地址,因為這四個參數的值都有會被iconv
函數改變。iconv
會逐步的將*inbuf
中的字符轉換到*outbuf
中,並增加*inbuf
指針減少*inbytesleft
的值,以及增加*outbuf
指針減少*outbytesleft
的值。
iconv函數會因為以下四種原因停止並返回:
*input
中遇到了一個非法的多字節序列,返回(size_t)-1並置errno=EILSEQ,返回時*inbuf
指向非法字符的開頭。*input
全部轉換完,返回不可轉換的字符數。*input
中遇到了一個不完整的多字節序列,返回(size_t)-1並置errno=EINVAL,返回時*inbuf
指向不完整字符的開頭。*output
空間不夠,返回(size_t)-1並置errno=E2BIG。
以下給出一個示例函數,將一個字符串從utf-8轉換成gbk后再重新轉換成utf-8。
1 |
|
我用的xshell連接到虛擬機,先將terminal的編碼設置為utf-8運行,結果如下
1 |
original : 你好,中南。- Hello, CSU. |
再將terminal的編碼設置為gbk運行,結果如下
1 |
original : 浣犲ソ錛屼腑鍗椼€? Hello, CSU. |
可見,在相應的編碼下,對應的字符串能正常顯示。
http://vimersu.win/blog/2014/03/04/linux-iconv/