cbMultiByte
If this parameter is -1, the function processes the entire input string including the null terminator. The resulting wide character string therefore has a null terminator, and the returned length includes the null terminator.
#pragma once #include <string> #include <Windows.h> using namespace std; #define SAFE_DELETE_ARRAY(p)/ if (p != NULL)/ {/ delete [] p;/ p = NULL;/ }/ namespace utility { string unicode_2_ansi(const wchar_t *p_in) { int nLen = WideCharToMultiByte(CP_OEMCP, 0, p_in, -1, NULL, 0, NULL, FALSE); char *p_out = new char[nLen]; memset(p_out, 0, nLen); WideCharToMultiByte(CP_OEMCP, 0, p_in, -1, p_out, nLen, NULL, FALSE); string s_out(p_out); SAFE_DELETE_ARRAY(p_out); return s_out; } wstring ansi_2_unicode(const char *p_in) { int nLen = MultiByteToWideChar(CP_ACP, 0, p_in, -1, NULL, 0); wchar_t *p_out = new wchar_t[nLen]; memset(p_out, 0, nLen); MultiByteToWideChar(CP_ACP, 0, p_in, -1, p_out, nLen); wstring s_out(p_out); SAFE_DELETE_ARRAY(p_out); return s_out; } string unicode_2_utf8(const wchar_t *p_in) { int nLen = WideCharToMultiByte(CP_UTF8, 0, p_in, -1, NULL, 0, NULL, FALSE); char *p_out = new char[nLen]; memset(p_out, 0, nLen); WideCharToMultiByte(CP_UTF8, 0, p_in, -1, p_out, nLen, NULL, FALSE); string s_out(p_out); SAFE_DELETE_ARRAY(p_out); return s_out; } wstring utf8_2_unicode(const char *p_in) { int nLen = MultiByteToWideChar(CP_UTF8, 0, p_in, -1, NULL, 0); wchar_t *p_out = new wchar_t[nLen]; memset(p_out, 0, nLen); MultiByteToWideChar(CP_UTF8, 0, p_in, -1, p_out, nLen); wstring s_out(p_out); SAFE_DELETE_ARRAY(p_out); return s_out; } string ansi_2_utf8(const char *p_in) { wstring str = ansi_2_unicode(p_in); return unicode_2_utf8(str.c_str()); } string wstring_2_string(wstring s_in) { return unicode_2_ansi(s_in.c_str()); } wstring string_2_wstring(string s_in) { return ansi_2_unicode(s_in.c_str()); } }