iconv是linux下的編碼轉換的工具,它提供命令行的使用和函數接口支持linux
man手冊iconv命令用法以下:函數
iconv -f encoding -t encoding inputfile
有以下選項可用:工具
輸入/輸出格式規範:-f, --from-code=名稱 原始文本編碼 -t, --to-code=名稱 輸出編碼
信息:編碼
-l, --list 列舉全部已知的字符集
輸出控制:spa
-c 從輸出中忽略無效的字符 -o, --output=FILE 輸出文件 -s, --silent 關閉警告 --verbose 打印進度信息
示例:下面的命令是將一個utf8編碼的文件轉換爲一個unicode編碼的文件命令行
iconv -f utf-8 -t unicode utf8file.txt> unicodefile.txt
iconv函數族的頭文件是iconv.h,使用前需包含之。指針
#include <iconv.h>
iconv函數族有三個函數,原型以下:code
iconv_t iconv_open(const char *tocode, const char *fromcode);
此函數說明將要進行哪兩種編碼的轉換,tocode是目標編碼,fromcode是原編碼,該函數返回一個轉換句柄,供如下兩個函數使用。blog
size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函數從inbuf中讀取字符,轉換後輸出到outbuf中,inbytesleft用以記錄還未轉換的字符數,outbytesleft用以記錄輸出緩衝的剩餘空間。 接口
注意:inbuf和outbuf都必須是有存儲空間的不能定義爲常量,如:char *inbuf = "abc" 或者是char *outbuf = "123"這樣定義都是錯誤的。另外inbuf,inbytesleft,outbuf,outbytesleft這幾個參數在使用過程當中都會改變,最好是先保存一下原值,而後再使用
int iconv_close(iconv_t cd);
此函數用於關閉轉換句柄,釋放資源。
基本使用舉例:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iconv.h> int main(int argc, char **argv) { /* 目的編碼, TRANSLIT:遇到沒法轉換的字符就找相近字符替換 * IGNORE :遇到沒法轉換字符跳過*/ //char *encTo = "UNICODE//TRANSLIT"; char *encTo = "UNICODE//IGNORE"; /* 源編碼 */ char *encFrom = "UTF-8"; /* 得到轉換句柄 *@param encTo 目標編碼方式 *@param encFrom 源編碼方式 * * */ iconv_t cd = iconv_open (encTo, encFrom); if (cd == (iconv_t)-1) { perror ("iconv_open"); } /* 須要轉換的字符串 */ char inbuf[1024] = "abcdef哈哈哈哈行"; size_t srclen = strlen (inbuf); /* 打印須要轉換的字符串的長度 */ printf("srclen=%d\n", srclen); /* 存放轉換後的字符串 */ size_t outlen = 1024; char outbuf[outlen]; memset (outbuf, 0, outlen); /* 因爲iconv()函數會修改指針,因此要保存源指針 */ char *srcstart = inbuf; char *tempoutbuf = outbuf; /* 進行轉換 *@param cd iconv_open()產生的句柄 *@param srcstart 須要轉換的字符串 *@param srclen 存放還有多少字符沒有轉換 *@param tempoutbuf 存放轉換後的字符串 *@param outlen 存放轉換後,tempoutbuf剩餘的空間 * * */ size_t ret = iconv (cd, &srcstart, &srclen, &tempoutbuf, &outlen); if (ret == -1) { perror ("iconv"); } printf ("inbuf=%s, srclen=%d, outbuf=%s, outlen=%d\n", inbuf, srclen, outbuf, outlen); int i = 0; for (i=0; i<strlen(outbuf); i++) { printf("%x\n", outbuf[i]); } /* 關閉句柄 */ iconv_close (cd); return 0; }
下面作了一下函數的封裝:
/* * ===================================================================================== * * Filename: iconv.c * * Description: j * * Version: 1.0 * Created: 08/05/2015 05:51:47 PM * Revision: none * Compiler: gcc * * Author: YOUR NAME (), * Organization: * * ===================================================================================== */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <iconv.h> bool unicode_to_utf8 (char *inbuf, size_t *inlen, char *outbuf, size_t *outlen) { /* 目的編碼, TRANSLIT:遇到沒法轉換的字符就找相近字符替換 * IGNORE :遇到沒法轉換字符跳過*/ char *encTo = "UTF-8//IGNORE";
/* 源編碼 */ char *encFrom = "UNICODE"; /* 得到轉換句柄 *@param encTo 目標編碼方式 *@param encFrom 源編碼方式 * * */ iconv_t cd = iconv_open (encTo, encFrom); if (cd == (iconv_t)-1) { perror ("iconv_open"); } /* 須要轉換的字符串 */ printf("inbuf=%s\n", inbuf); /* 打印須要轉換的字符串的長度 */ printf("inlen=%d\n", *inlen); /* 因爲iconv()函數會修改指針,因此要保存源指針 */ char *tmpin = inbuf; char *tmpout = outbuf; size_t insize = *inlen; size_t outsize = *outlen; /* 進行轉換 *@param cd iconv_open()產生的句柄 *@param srcstart 須要轉換的字符串 *@param inlen 存放還有多少字符沒有轉換 *@param tempoutbuf 存放轉換後的字符串 *@param outlen 存放轉換後,tempoutbuf剩餘的空間 * * */ size_t ret = iconv (cd, &tmpin, inlen, &tmpout, outlen); if (ret == -1) { perror ("iconv"); } /* 存放轉換後的字符串 */ printf("outbuf=%s\n", outbuf); //存放轉換後outbuf剩餘的空間 printf("outlen=%d\n", *outlen); int i = 0; for (i=0; i<(outsize- (*outlen)); i++) { //printf("%2c", outbuf[i]); printf("%x\n", outbuf[i]); } /* 關閉句柄 */ iconv_close (cd); return 0; } bool utf8_to_unicode (char *inbuf, size_t *inlen, char *outbuf, size_t *outlen) { /* 目的編碼, TRANSLIT:遇到沒法轉換的字符就找相近字符替換 * IGNORE :遇到沒法轉換字符跳過*/ char *encTo = "UNICODE//IGNORE"; /* 源編碼 */ char *encFrom = "UTF-8"; /* 得到轉換句柄 *@param encTo 目標編碼方式 *@param encFrom 源編碼方式 * * */ iconv_t cd = iconv_open (encTo, encFrom); if (cd == (iconv_t)-1) { perror ("iconv_open"); } /* 須要轉換的字符串 */ printf("inbuf=%s\n", inbuf); /* 打印須要轉換的字符串的長度 */ printf("inlen=%d\n", *inlen); /* 因爲iconv()函數會修改指針,因此要保存源指針 */ char *tmpin = inbuf; char *tmpout = outbuf; size_t insize = *inlen; size_t outsize = *outlen; /* 進行轉換 *@param cd iconv_open()產生的句柄 *@param srcstart 須要轉換的字符串 *@param inlen 存放還有多少字符沒有轉換 *@param tempoutbuf 存放轉換後的字符串 *@param outlen 存放轉換後,tempoutbuf剩餘的空間 * * */ size_t ret = iconv (cd, &tmpin, inlen, &tmpout, outlen); if (ret == -1) { perror ("iconv"); } /* 存放轉換後的字符串 */ printf("outbuf=%s\n", outbuf); //存放轉換後outbuf剩餘的空間 printf("outlen=%d\n", *outlen); int i = 0; for (i=0; i<(outsize- (*outlen)); i++) { //printf("%2c", outbuf[i]); printf("%x\n", outbuf[i]); } /* 關閉句柄 */ iconv_close (cd); return 0; } int main () { /* 須要轉換的字符串 */ //char inbuf[1024] = "abcdef哈哈哈哈行"; char *text = "漢"; char inbuf[1024] = {}; strcpy (inbuf, text); size_t inlen = strlen (inbuf); /* 存放轉換後的字符串 */ char outbuf[1024] = {}; size_t outlen = 1024; utf8_to_unicode (inbuf, &inlen, outbuf, &outlen); printf ("print outbuf: %s\n", outbuf); size_t outsize = strlen(outbuf); size_t insize = 1024; char instr[1024] = {}; unicode_to_utf8 (outbuf, &outsize, instr, &insize); printf ("print buf: %s\n", instr); return 0; }