一 字符编码转换(支持跨平台)
std::string AnsiToUtf8(const char * ansi){
#ifdef WIN32
int len = MultiByteToWideChar(CP_ACP, 0, ansi, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, ansi, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
std::string ret = str;
if(str) delete[] str;
return ret;
#else
std::string ret;
int in_buflen = strlen(ansi);
char * in_buf = new char[in_buflen + 1];
memcpy(in_buf, ansi, strlen(ansi));
int out_buflen = 2 * in_buflen;
char * out_buf = new char[out_buflen + 1];
char from_charset[] = "gb2312";
char to_charset[] = "utf-8";
CharConvert(from_charset, to_charset, in_buf, in_buflen, out_buf, out_buflen);
ret = out_buf;
delete [] in_buf;
delete [] out_buf;
return ret;
#endif
}
std::string Utf8ToAnsi(const char * utf8){
#ifdef WIN32
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
std::string ret = str;
if(str) delete[] str;
return ret;
#else
std::string ret;
int in_buflen = strlen(utf8);
char * in_buf = new char[in_buflen + 1];
memcpy(in_buf, utf8, strlen(utf8));
int out_buflen = 2 * in_buflen;
char * out_buf = new char[out_buflen + 1];
char from_charset[] = "utf-8";
char to_charset[] = "gb2312";
CharConvert(from_charset, to_charset, in_buf, in_buflen, out_buf, out_buflen);
ret = out_buf;
delete [] in_buf;
delete [] out_buf;
return ret;
#endif
}
二 窄字符合宽字符转换
std::wstring StringToWString(std::string str){
int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wstr, len);
std::wstring ret(wstr);
if(wstr) delete[] wstr;
return ret;
}
std::string WStringToString(std::wstring wstr){
int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, str, len, NULL, NULL);
std::string ret(str);
if(str) delete[] str;
return ret;
}