libiconv程式設計API

2021-07-10 22:47:19 字數 1938 閱讀 5452

在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...