MultiByteToWideChar()与WideCharToMultiByte()函数乱码问题的解决办法

       在标准的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测试输出如下:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值