字符编码的转换(Unicode、UTF-8、ANSI)

C++的项目中不同平台之间的编码往往不一样,如果不同编码格式用一套字符读取格式读取就会出现乱码。因此,一般都是转化成UTF-8这种平台通用,且支持性很好的编码格式。

ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00 ~ 0x7F范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。
 
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。

 

//ANSI 转UTF8

string ANSIToUTF8(const char *szANSI)
{
    string strOutUTF8 = "";
    WCHAR * str1;
    //计算接收到待转换字符串的缓冲区所需ansi字符数
    int n = MultiByteToWideChar(CP_ACP, 0, szANSI, -1, NULL, 0);
    str1 = new WCHAR[n];
    //向str1缓冲区写入ansi字符
    MultiByteToWideChar(CP_ACP, 0, szANSI, -1, str1, n);
    //计算接收到待转换字符串的缓冲区所需宽字节数
    n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
    char *str2 = new char[n];
    //向str2缓冲区写入字符
    WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
    strOutUTF8 = str2;
    delete[]str1;
    str1 = NULL;
    delete[]str2;
    str2 = NULL;
    return strOutUTF8;
}

//UTF8 转 ANSI
string UTF8ToANSI(const char *szUTF8)
{    
    int srcCodeLen=0;
    //计算接收到待转换字符串的缓冲区所需宽字符数
    srcCodeLen = MultiByteToWideChar(CP_UTF8,NULL,szUTF8,strlen(szUTF8),NULL,0);
    wchar_t* result_t = new wchar_t[srcCodeLen+1];
    //向result_t缓冲区写入宽字符
    MultiByteToWideChar(CP_UTF8,NULL,szUTF8,strlen(szUTF8),result_t,srcCodeLen);
    result_t[srcCodeLen] = '\0';
    //计算接收到待转换字符串的缓冲区所需字节数
    srcCodeLen=WideCharToMultiByte(CP_ACP,NULL,result_t,wcslen(result_t),NULL,0,NULL,NULL);
    char* result = new char[srcCodeLen+1];
    //向result缓冲区写入字符
    WideCharToMultiByte(CP_ACP,NULL,result_t,wcslen(result_t),result,srcCodeLen,NULL,NULL);
    result[srcCodeLen] = '\0';
    string srcAnsiCode = "";
    srcAnsiCode = (string)result;
    delete result_t;
    delete result;
    return srcAnsiCode;
}

你可能感兴趣的:(字符编码的转换(Unicode、UTF-8、ANSI))