在标准的WinCE4.2或WinCE5.0 SDK模拟器下,MultiByteToWideChar()与WideCharToMultiByte()函数都无法正常工作,其转换之后的字符全是乱码.反复调整参数依然无法解决.不过这个不是代码问题,其结症在于操作系统区域默认语言是不是中文,中文的windows系统,区域默认语言设置为英文,就会出现乱码。经过多日摸索,发现CString可以完美实现MBCS编码与unicode编码互转,且不会出现乱码。但CString实现转码的方法有点特别,特地记录下来。
1、MBCS编码转unicode编码
const wchar_t* strW = L"a宽字符";
CStringA strWA; // 注意CString的构造函数不支持转码
strWA = strW; // CString 赋值操作符会进行转码
2、unicode编码转MBCS编码
const char* strA = "a宽字符";
CStringW strU; // 注意CString的构造函数不支持转码
strU = strA; // CString 赋值操作符会进行转码
附上测试代码与测试结果
void test()
{
const char* strA = "a宽字符";
CStringW strU; // 注意CString的构造函数不支持转码
strU = strA; // CString 赋值操作符会进行转码
char strA2[16];
strcpy_s(strA2, strA);
CStringW strU2;
strU2 = strA2;
printf("\n\n test mbcs to wchar:len_a=%d len_w=%d\n", strlen(strA),
strU.GetLength());
dump_memory("strA", strA, strlen(strA));
dump_memory("strU", strU.GetBuffer(), strU.GetLength() * sizeof(wchar_t));
strU.ReleaseBuffer();
dump_memory("strA2", strA2, strlen(strA2));
dump_memory("strU2", strU2.GetBuffer(), strU2.GetLength() * sizeof(wchar_t));
strU2.ReleaseBuffer();
const wchar_t* strW = L"a宽字符";
CStringA strWA; // 注意CString的构造函数不支持转码
strWA = strW; // CString 赋值操作符会进行转码
wchar_t strW2[16];
wcscpy_s(strW2, strW);
CStringA strWA2;
strWA2 = strW2;
printf("\n\n test wchar to mbcs:len_a=%d len_w=%d\n", wcslen(strW),
strWA.GetLength());
dump_memory("strW", strW, wcslen(strW)*sizeof(wchar_t));
dump_memory("strWA", strWA.GetBuffer(), strWA.GetLength());
strWA.ReleaseBuffer();
dump_memory("strW2", strW2, wcslen(strW2) * sizeof(wchar_t));
dump_memory("strWA2", strWA2.GetBuffer(), strWA2.GetLength());
strWA2.ReleaseBuffer();
}
在区域默认语言设置为英文的WIN10测试输出如下: