天天看點

程式設計實作GBK到UFT-8編碼的轉換

/iconv_linux下字元集編碼轉換輕松實作

(1) iconv_t iconv_open(

const

char

*tocode, 

const

char

*fromcode);

//此函數說明将要進行哪兩種編碼的轉換,tocode是目标編碼,fromcode是原編碼,該函數傳回一個轉換句柄,供以下兩個函數使用。

(2) 

size_t

iconv(iconv_t cd,

char

**inbuf,

size_t

*inbytesleft,

char

**outbuf,

size_t

*outbytesleft);

//此函數從inbuf中讀取字元,轉換後輸出到outbuf中,inbytesleft用以記錄還未轉換的字元數,outbytesleft用以記錄輸出緩沖的剩餘空間。

(3) 

int

iconv_close(iconv_t cd);

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

//例子1: 用C語言實作的轉換示例程式

#include <iconv.h>

#define OUTLEN 255

main()

{

char

*in_utf8 = 

"姝e?ㄥ??瑁?"

;

char

*in_gb2312 = 

"正在安裝"

;

char

out[OUTLEN];

rc = u2g(in_utf8,

strlen

(in_utf8),out,OUTLEN);

printf

(

"unicode-->gb2312 out=%sn"

,out);

//gb2312碼轉為unicode碼

rc = g2u(in_gb2312,

strlen

(in_gb2312),out,OUTLEN);

printf

(

"gb2312-->unicode out=%sn"

,out);

}

int

code_convert(

char

*from_charset,

char

*to_charset,

char

*inbuf,

int

inlen,

char

*outbuf,

int

outlen)

{

iconv_t cd;

int

rc;

char

**pin = &inbuf;

char

**pout = &outbuf;

cd = iconv_open(to_charset,from_charset);

if

(cd==0) 

return

-1;

memset

(outbuf,0,outlen);

if

(iconv(cd,pin,&inlen,pout,&outlen)==-1) 

return

-1;

iconv_close(cd);

return

0;

}

int

u2g(

char

*inbuf,

int

inlen,

char

*outbuf,

int

outlen)

{

return

code_convert(

"utf-8"

,

"gb2312"

,inbuf,inlen,outbuf,outlen);

}

int

g2u(

char

*inbuf,

size_t

inlen,

char

*outbuf,

size_t

outlen)

{

return

code_convert(

"gb2312"

,

"utf-8"

,inbuf,inlen,outbuf,outlen);

}

//例子2: 用C++語言實作的轉換示例程式

#include <iconv.h>

#include <iostream>

#define OUTLEN 255

using

namespace

std;

// 代碼轉換操作類

class

CodeConverter {

private

:

iconv_t cd;

public

:

// 構造

CodeConverter(

const

char

*from_charset,

const

char

*to_charset) {

cd = iconv_open(to_charset,from_charset);

}

// 析構

~CodeConverter() {

iconv_close(cd);

}

// 轉換輸出

int

convert(

char

*inbuf,

int

inlen,

char

*outbuf,

int

outlen) {

char

**pin = &inbuf;

char

**pout = &outbuf;

memset

(outbuf,0,outlen);

return

iconv(cd,pin,(

size_t

*)&inlen,pout,(

size_t

*)&outlen);

}

};

int

main(

int

argc, 

char

**argv)

{

char

*in_utf8 = 

"姝e?ㄥ??瑁?"

;

char

*in_gb2312 = 

"正在安裝"

;

char

out[OUTLEN];

// utf-8-->gb2312

CodeConverter cc = CodeConverter(

"utf-8"

,

"gb2312"

);

cc.convert(in_utf8,

strlen

(in_utf8),out,OUTLEN);

cout << 

"utf-8-->gb2312 in="

<< in_utf8 << 

",out="

<< out << endl;

// gb2312-->utf-8

CodeConverter cc2 = CodeConverter(

"gb2312"

,

"utf-8"

);

cc2.convert(in_gb2312,

strlen

(in_gb2312),out,OUTLEN);

cout << 

"gb2312-->utf-8 in="

<< in_gb2312 << 

",out="

<< out << endl;

}

二、利用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為我們提供了強大的編碼轉換工具,給我們帶來了友善。

繼續閱讀