转载自:https://blog.csdn.net/yfw418/article/details/1654652

一、利用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;
}
posted on 2020-07-04 15:50  步孤天  阅读(4188)  评论(0编辑  收藏  举报