使用iconv命令輕鬆實現linux下字符集編碼的轉換

       昨天晚上郎師兄打電話說,個人結果文件他打開是亂碼,問我是否是字符編碼沒處理好。早晨早早的來到實驗室,請教了下同窗,才知道linux shell 配置文件中默認的字符集編碼爲UTF-8 。UTF-8是unicode的一種表達方式,gb2312是和unicode都是字符的編碼方式,因此說gb2312跟utf-8的概念應該不是一個層次上的。在LINUX上進行編碼轉換時,能夠利用iconv命令實現,這是針對文件的,即將指定文件從一種編碼轉換爲另外一種編碼。          查了下iconv命令用法以下: iconv [選項...] [文件...] 有以下選項可用: 輸入/輸出格式規範: -f, --from-code=名稱 原始文本編碼 -t, --to-code=名稱 輸出編碼 信息: -l, --list 列舉全部已知的字符集 輸出控制: -c 從輸出中忽略無效的字符 -o, --output=FILE 輸出文件 -s, --silent 關閉警告 --verbose 打印進度信息 因此,我在程序的末尾直接加了一句 iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt 解決了問題。 在網上查了些資料還知道在LINUX上進行編碼轉換時,還能夠利用iconv函數族編程實現。 /*如下內容摘自[url]http://www.xrss.cn/Info/10425.Html[/url]*/ iconv函數族的頭文件是iconv.h,使用前需包含之。 #include <iconv.h> iconv函數族有三個函數,原型以下: (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語言實現的轉換示例程序 /* f.c : 代碼轉換示例C程序 */ #include <iconv.h> #define OUTLEN 255 main() { char *in_utf8 = "姝e?ㄥ??瑁?"; char *in_gb2312 = "正在安裝"; char out[OUTLEN]; //unicode碼轉爲gb2312碼 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; } //UNICODE碼轉爲GB2312碼 int u2g(char *inbuf,int inlen,char *outbuf,int outlen) { return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen); } //GB2312碼轉爲UNICODE碼 int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen) { return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); } 例子2: 用C++語言實現的轉換示例程序 /* f.cpp : 代碼轉換示例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; }
相關文章
相關標籤/搜索