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