遇到一个奇怪的问题——关于VS2013、VS2015中字符集(多字节字符集和Unicode字符集)的选择

喵哥最近在写一个控制程序和被控制程序,脑子进水般的同时用了VS2013和VS2015,一个程序对应一个,最开始,两者都采用Unicode字符集,但是控制程序发出的指令不能被被控制程序接收,绞尽脑汁的思考,才想到可能是由于字符集的原因——因为在被控制程序接收指令的地方有这样一段代码:

/*****************接收ShellExecute的消息************************/
	CString str;
	for (int i = 1; i < __argc; i++) { str += __argv[i];} 
	

	/***************************设置INDEX以选择需要的相机**********************/
	if (str == "openCamera1")       CINDEX = 0;
	else if (str == "openCamera2")	CINDEX = 1;
	else if (str == "openCamera3")	CINDEX = 2;
	else if (str == "openCamera4")	CINDEX = 3;
	else if (str == "openCamera5")	CINDEX = 4;
	else if (str == "openCamera6")	CINDEX = 5;

可能是接收时,在这里出了问题(之前采用Unicode字符集,if语句里的字符串前有一个L,如L"openCamera1"),于是把字符集改成了多字节字符集,问题就得到解决了。

 

PS:对于字符的定义,Unicode下用wchar_t(#define wchar_t  WHAR),多字符编码是char。在windows系统下,每套API都提供两套接口:1、xxA(.)为传统的多字符集;2、xxW(..)为Unicode字符集。根据VS项目设置的字符集,API可以自动调用相应的API。

TCHAR类型:自适应Unicode项目与多字符集项目
a)当VS项目设置为多字符集时,TCHAR被系统定义为char类型
b)当VS项目设置为Unicode时,TCHAR被系统定义为wchar_t类型
c)当VS项目设置为Unicode时,_TEXT(x)被系统定义为L(x)Unicode类型常量。
d)当VS项目设置为多字符集时,_TEXT(x)被系统定义为x多字符集类型常量。
e)使用_T或_TEXT时必须包含<tchar.h>,使用它来修饰字符串代码具有可移植性。

如:TCHAR *t = _T("abc");

char whar_t TCHAR之间相互转换可以采用T2A,W2A,A2W,A2T,使用前需要包含头文件:AtlBase.h,以及声明标识符   USES_CONVERSION;

另外,_bstr_t类((comutil.h))相对比较方便,可以随时存入和取出两种字符串,_bstr_t一般在MFC工程下使用。

例如:    _bstr_t bstr = "abc";
    bstr += L"中共";

    char* p = bstr;
    wchar_t *p2 = bstr;

  • 0
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

阿喵不是猫

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值