主要是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;
}
本文详细探讨了WideCharToMultiByte函数在不同系统环境下使用CP_ACP代码页转换中文字符时遇到的问题及解决方案。通过实例代码展示了在中文与英文系统下如何正确设置代码页以实现中文字符的正常转换。
2万+

被折叠的 条评论
为什么被折叠?



