VS2008字符集未设置项目中,const char转宽字符乱码问题排查
问题分析与解决
你的问题核心在于字符编码不匹配,以及VS2008项目Character Set = Not Set下的默认行为限制:
问题根源
当项目字符集设为Not Set时,mbstowcs_s函数会使用系统默认的ANSI代码页(比如中文Windows是936)完成多字节到宽字符的转换。但你字符串中的Καλημέρα是希腊文,对应的字节序列是UTF-8编码,系统默认ANSI代码页无法识别这些字节,因此转换失败。
修复方案
方案一:用MultiByteToWideChar指定UTF-8编码转换
直接指定转换时使用UTF-8代码页,绕过系统默认代码页的限制,代码修改如下:
const char* test = "Καλημέρα"; // 先计算需要的宽字符数 int wcharCount = MultiByteToWideChar(CP_UTF8, 0, test, -1, NULL, 0); wchar_t* wcstring = new wchar_t[wcharCount]; // 执行转换 MultiByteToWideChar(CP_UTF8, 0, test, -1, wcstring, wcharCount); // 使用后记得释放内存 delete[] wcstring;
方案二:切换进程代码页为UTF-8(谨慎使用)
通过_setmbcp将进程的多字节代码页设置为UTF-8(65001),这样mbstowcs_s就能正确处理UTF-8字符串,但这个设置会影响整个进程的多字节字符处理,可能和其他依赖系统默认代码页的代码冲突:
#include <mbctype.h> // 先设置代码页为UTF-8 _setmbcp(65001); const char* test = "Καλημέρα"; size_t newsize = strlen(test) + 1; wchar_t* wcstring = new wchar_t[newsize]; size_t convertedChars = 0; mbstowcs_s(&convertedChars, wcstring, newsize, test, _TRUNCATE); // 使用后释放内存 delete[] wcstring;
额外注意
确保你的源文件编码是UTF-8:在VS2008中,依次点击「文件」→「高级保存选项」,选择「Unicode (UTF-8 带签名)」保存,避免源文件中的字符串被错误编码。
内容的提问来源于stack exchange,提问作者Maverick
相关产品推荐
相关产品推荐

