C++ UTF-8和GBK相互轉化


轉載自: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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM