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;
}