主要是WideCharToMultiByte的第一个参数codepage造成的,如前面所使用的CP_ACP所表达的意思是使用系统字符集转换,但是由于此时的系统字符集为英文,在这个codepage中并没有中文,所以转换出错.
1.在正常的中文系统下执行MultiByteToWideChar很正常,其中,第一个参数为:CP_ACP
char* unicodeTOansi(const wchar_t* unicode) { // unicode to ansi // wchar_t* wszString = L"abcd1234ÄãÎÒËû"; //Ԥת»»£¬µÃµ½ËùÐè¿Õ¼äµÄ´óС£¬Õâ´ÎÓõĺ¯ÊýºÍÉÏÃæÃû×ÖÏà·´ int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, unicode, wcslen(unicode), NULL, 0, NULL, NULL); //ͬÉÏ£¬·ÖÅä¿Õ¼äÒª¸ø'\0'Áô¸ö¿Õ¼ä char* szAnsi = new char[ansiLen + 1]; //ת»» //unicode°æ¶ÔÓ¦µÄstrlenÊÇwcslen ::WideCharToMultiByte(CP_ACP, NULL, unicode, wcslen(unicode), szAnsi, ansiLen, NULL, NULL); //×îºó¼ÓÉÏ'\0' szAnsi[ansiLen] = '\0'; return szAnsi; }
2.在英文系统下执行MultiByteToWideChar,取得的字符编码全部变成了3F,后将"CP_ACP"替换为936,就正常显示了。
在英文系统下:
#define CP_ACP 0 // default to ANSI code page
char* unicodeTOansi(const wchar_t* unicode) { // unicode to ansi // wchar_t* wszString = L"abcd1234ÄãÎÒËû"; //Ԥת»»£¬µÃµ½ËùÐè¿Õ¼äµÄ´óС£¬Õâ´ÎÓõĺ¯ÊýºÍÉÏÃæÃû×ÖÏà·´ int ansiLen = ::WideCharToMultiByte(936, NULL, unicode, wcslen(unicode), NULL, 0, NULL, NULL); //ͬÉÏ£¬·ÖÅä¿Õ¼äÒª¸ø'\0'Áô¸ö¿Õ¼ä char* szAnsi = new char[ansiLen + 1]; //ת»» //unicode°æ¶ÔÓ¦µÄstrlenÊÇwcslen ::WideCharToMultiByte(936, NULL, unicode, wcslen(unicode), szAnsi, ansiLen, NULL, NULL); //×îºó¼ÓÉÏ'\0' szAnsi[ansiLen] = '\0'; return szAnsi; }