原创 VS2010 控件显示CString类型的字符串,出现乱码的问题

2016-4-13 20:26 2246 21 21 分类: 软件与OS

    在写基于对话框的程序,用到一个Button按钮,单击时,查询USB口接的设备,并在ComboBox控件里列出其描述符。

使用如下代码:

str.Format(("%s"), BufPtrs);  // str为CString 变量
m_device_list.AddString(str);   // m_device_list为CComboBox 变量  

编译提示错误:不能将参数 1 从“const char [3]”转换为“const wchar_t *。

 

    查询资料得到结果:VS2010默认编码是Unicode,我将其改为多字节编码后,编译OK,运行也不出现乱码!但是,多字节编码已不推荐使用,应该是兼容性不好。

所以我将编码格式改为Unicode,看是否有其他方式可以解决?

代码修改为:

str.Format((_T("%s"), BufPtrs);  // str为CString 变量
m_device_list.AddString(str);   // m_device_list为CComboBox 变量  

编译OK,但运行后,str内容为乱码,导致显示也是乱码!

 

    后来,在网上找到一个说法:unicode环境下格式化ansi字符串要用 %S。

修改为:

str.Format((_T("%S"), BufPtrs);  // str为CString 变量
m_device_list.AddString(str);   // m_device_list为CComboBox 变量  

编译OK,运行OK,无乱码!

 

最后说明:

    1)Visual C++里边定义字符串的时候,用_T来保证兼容性,VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改,它固定使用16 bits(两个字节)来表示一个字符。_T("")与L"",效果是一样的。

如: L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。strlen("asd") = 3; strlen(L"asd") = 6;

    2)关于 %s 与 %S 

https://msdn.microsoft.com/en-us/library/hf4y5e3w

 

文章评论0条评论)

登录后参与讨论
我要评论
0
21
关闭 站长推荐上一条 /2 下一条