一、利用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文件。
二、C++代碼進行編碼轉換
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#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);
}
};
void unescape(char * str)
{
int pos,len=strlen(str);
wchar_t wstr[100];
char code[5]={0};
char *_str,*p=str;
char out[OUTLEN];
memset(wstr,0,sizeof(wstr));
pos = 0;
while (*p!=0)
{
_str = strchr(p,'%');
memset(code,0,sizeof(code));
if(_str[1]=='u'){
memcpy(code, _str+2, 4);
p = p + 6;
}else{
memcpy(code, _str+1, 2);
p = p + 3;
}
long tmpl = strtol(code, (char**)NULL, 16);
printf("long:%u\n");
wstr[pos++] = (wchar_t)tmpl;
}
memset(str,0,sizeof(char)*len);
setlocale(LC_ALL, "");
wcstombs(str, wstr, sizeof(str)/sizeof(char));
CodeConverter cc = CodeConverter("utf-8","gb2312");
cc.convert(str,strlen(str),out,OUTLEN);
cout << "utf-8-->gb2312 in=" << str << ",out=" << out << endl;
// gb2312-->utf-8
CodeConverter cc2 = CodeConverter("gb2312","utf-8");
cc2.convert(str,strlen(str),out,OUTLEN);
cout << "gb2312-->utf-8 in=" << str << ",out=" << out << endl;
}
int main(void)
{
char str[]="%u559C%u5267";
unescape(str);
printf("中文字符是:%s\n", str);
return 0;
}