Linux下編碼轉換(iconv函式族)

2021-06-12 08:38:40 字數 3662 閱讀 6439

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

函式功能:

此函式用於關閉轉換控制代碼,釋放資源。

示例**:

封裝乙個轉換型別:

[cpp]view plain

copy

class

ccodeconverter  

~ccodeconverter()  

//進行轉換

intconvert(

char

* srcbuf, 

intsrclen, 

char

* destbuf, 

intdestlen)  

//獲取錯誤資訊

intgeterrinfo()  

case

eilseq:  

case

einval:  

default

:  break

;  }  

return

nerr;  

}  private

:  //轉換控制代碼

iconv_t hcodeconverter;  

intnerr;  

};  

以utf-8轉為utf-16為例

[cpp]view plain

copy

intmain()  

printf("轉換成功\n"

);     

}  

除錯,檢視記憶體,destbuf內容如下:

(gdb) print destbuf

$1 = 0x804b018 "\377\376b"

(gdb) print destbuf+1

$2 = 0x804b019 "\376b"

(gdb) print destbuf+2

$3 = 0x804b01a "b"

(gdb) print destbuf+3

$4 = 0x804b01b ""

(gdb) print destbuf+4

$5 = 0x804b01c "a"

(gdb) print destbuf+5

$6 = 0x804b01d ""

(gdb) print destbuf+6

$7 = 0x804b01e "i"

問題:不明白為什麼前面有"\377\376",是用來標識編碼型別的麼?

二、iconv命令

iconv命令用於轉換指定檔案的編碼,預設輸出到標準輸出裝置,亦可指定輸出檔案。

用法: iconv [選項...] [檔案...]

有如下選項可用:

輸入/輸出格式規範:

-f, --from-code=名稱 原始文字編碼

-t, --to-code=名稱 輸出編碼資訊:

-l, --list 列舉所有已知的字符集輸出控制:

-c 從輸出中忽略無效的字元

-o, --output=file 輸出檔案

-s, --silent 關閉警告

--verbose 列印進度資訊

-?, --help 給出該系統求助列表

--usage 給出簡要的用法資訊

-v, --version 列印程式版本號

例子:iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt

這個命令讀取aaa.txt檔案,從utf-8編碼轉換為gb2312編碼,其輸出定向到bbb.txt檔案。

Linux下編碼轉換(iconv函式族)

在linux上進行編碼轉換時,既可以利用iconv函式族程式設計實現,也可以利用iconv命令來實現 針對檔案進行轉換 一 利用iconv函式族進行編碼轉換 iconv函式族的標頭檔案是iconv.h 使用前需包含之 include iconv函式族有三個函式,原型如下 1 iconv open 函...

linux 編碼型別轉換 iconv

用途說明 iconv命令是用來轉換檔案的編碼方式的 convert encoding of given files from one encoding to another 比如它可以將utf8編碼的轉換成gb18030的編碼,反過來也行。jdk中也提供了類似的工具native2ascii。linu...

Linux使用iconv進行編碼轉換

最近在做專案,為了能讓ui顯示中文,需要對中文進行編碼轉換。因為我用的是directfb,它只支援utf 8格式,所以要將gb2312轉換為utf 8,這時使用iconv是非常方便的。以下是我在專案中用到的一部分 首先要使用iconv的api需要包含它的標頭檔案 include iconv.h 或者...