在写基于对话框的程序,用到一个Button按钮,单击时,查询USB口接的设备,并在ComboBox控件里列出其描述符。
使用如下代码:
str.Format(("%s"), BufPtrs[u]); // 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[u]); // str为CString 变量
m_device_list.AddString(str); // m_device_list为CComboBox 变量
编译OK,但运行后,str内容为乱码,导致显示也是乱码!
后来,在网上找到一个说法:unicode环境下格式化ansi字符串要用%S。
修改为:
str.Format((_T("%S"), BufPtrs[u]); // 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