日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

linux中iconv函数,Linux下编码转换(iconv函数族)

發布時間:2025/3/12 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux中iconv函数,Linux下编码转换(iconv函数族) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://www.linuxdiyf.com/viewarticle.php?id=45164

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

函數功能:

此函數用于關閉轉換句柄,釋放資源。

示例代碼:

封裝一個轉換類型:

class CCodeConverter

{

public:

CCodeConverter(const char * fromCode, const char * toCode)

{

hCodeConverter=iconv_open(toCode, fromCode);

}

~CCodeConverter()

{

iconv_close(hCodeConverter);

}

//進行轉換

int convert(char * srcBuf, int srcLen, char * destBuf, int destLen)

{

//返回轉換的字符個數

int nConv=iconv(hCodeConverter, &srcBuf, (size_t *)&srcLen, &destBuf, (size_t *)&destLen);

//如果錯誤,則獲取錯誤碼

nErr=errno;

return nConv;

}

//獲取錯誤信息

int getErrInfo()

{

switch(nErr)

{

case E2BIG:

{

printf("errno:E2BGI(OutBuf空間不夠)\n");

break;

}

case EILSEQ:

{

printf("errno:EILSEQ(InBuf多字節序無效)\n");

break;

}

case EINVAL:

{

printf("errno:EINVAL(有殘留的字節未轉換)\n");

break;

}

default:

break;

}

return nErr;

}

private:

//轉換句柄

iconv_t hCodeConverter;

int nErr;

};

以utf-8轉為utf-16為例

int main()

{

int srcLen=12;

char * srcBuf=new char[srcLen];

memset(srcBuf, 0, srcLen);

strcpy(srcBuf, "BaiSe");

int destLen=2*srcLen;

char * destBuf=new char[destLen];

memset(destBuf, 0, destLen);

CCodeConverter cv=CCodeConverter("utf-8", "utf-16");

int nRet=cv.convert(srcBuf, srcLen, destBuf, destLen);

if(nRet<0)

{

cv.getErrInfo();

return -1;

}

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函数族)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。