在linux上進行編碼轉換時,既可以利用iconv函式族程式設計實現,也可以利用iconv命令來實現(針對檔案進行轉換)
一、利用iconv函式族進行編碼轉換
iconv函式族的標頭檔案是iconv.h
使用前需包含之:#include
iconv函式族有三個函式,原型如下:
(1) iconv_open()
函式原型:
iconv_t iconv_open(const char *tocode, const char *fromcode);
函式功能:
該函式分配乙個編碼轉換控制代碼
引數:1> tocode是目標編碼
2> fromcode是原編碼
支援的內碼包括:unicode相關編碼,如utf-8、utf-16等等;各國採用的ansi編碼,其中包括gb2312、big5等中文編碼方式。
返回值:
呼叫成功,則該函式返回乙個轉換控制代碼,供以下兩個函式使用;
呼叫失敗,返回-1,並且設定errno
可能的錯誤型別:
einval the conversion from fromcode to tocode is not supported by the implementation.
(2) iconv()
函式功能:進行實際的編碼轉換
函式原型:
size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
引數介紹:
1> cd是方法iconv_open()呼叫返回的轉碼控制代碼;
2> inbuf指向需要轉碼的緩衝區;
3> inbytesleft是inbuf所儲存的需要轉碼的位元組數;
4> outbuf存放轉碼結果;
5> outbytesleft存放outbuf空間的大小。
(不足之處:由於沒有辦法獲取轉換之後需要的記憶體大小,所以會造成記憶體空間的浪費!)
返回值:
呼叫成功,返回轉換的位元組數(不可逆轉呼叫的位元組數,可逆轉呼叫的位元組數不包括在內)
呼叫失敗,返回-1,並設定相應的errno。
注意:
iconv()是逐步掃瞄inbuf,每轉換乙個字元,就增加inbuf,減少inbytesleft,並將結果存入outbuf,結果位元組數存入outbytesleft
常見的三種情況:
情況一: inbuf不為空,而且*inbuf也不為空
此時,進行正常的編碼轉換
遇到下列情況將停止掃瞄並返回:
(1)inbuf中碰到非法的多位元組序
這種狀況下,會設定errno為eilseq,並返回-1;
(2)inbuf位元組被完全轉換
這種狀況下,返回轉換的位元組數
(3)inbuf中碰到不完整的多位元組序
這種狀況下,設定errno為einval,並返回-1;
(4)outbuf中沒有足夠的空間以進行下一次的字元轉換
這種狀況下,設定errno為e2big,並返回-1;
情況二:inbuf == null,或者*inbuf == null;但outbuf != null,且*outbuf != null
iconv會設定轉換狀態為初始狀態,並儲存轉換序列到*outbuf。如果outbuf空間不足,errno會設定為e2big,返回(size_t) (-1);
情況三:inbuf == null,或者*inbuf == null; 並且outbuf == null,*out == null
iconv設定轉換狀態為初始狀態
(3) iconv_close()
函式原型:
int iconv_close(iconv_t cd);
函式功能:
此函式用於關閉轉換控制代碼,釋放資源。
libiconv交叉移植
具體解釋一下 build就是你正在使用的機器 host就是你編譯好的程式可以執行的平台 target就是你編譯的程式可以處理的平台 這個build和host比較好理解,但是target就不好辦了,到底什麼意思呢?一般來說,我們平時所說的交差編譯用不到他target的,比如.configure bui...
libiconv使用小例子
最近用到一點轉碼的東西,在網上搜到乙個libiconv,使用了一下感覺還可以,不過還是有一兩處容易犯錯的地方,除錯了半天才搞明白,此處是乙個將utf 8轉換為gbk的小例子 std string convfromutf8 std string s size t inlen s.size const ...
交叉編譯使用libiconv
一 環境 虛擬機器 ubuntu 16.04 交叉編譯工具 二 編譯安裝 1 configure prefix usr local libiconv amba install host armv7l timesys linux gnueabi cc home iflytek dyye toolcha...