遇到一个奇怪的问题——关于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 *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;

你可能感兴趣的:(VS2013,错误总结)