目录
一、利用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
#include
#include
#include
#include
#include
#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
");
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
", str);
return 0;
}