VS C++开发问题总结

1、新建的MFC 对话框CString和char*的转换一直失败(vs工程默认配置)

在网上看了很多CString转char*的方法,但是转换一直失败,例如以下几种方式

CString m_IPADDR = "192.168.1.100";
char* ipaddr = (LPSTR)(LPCTSTR)m_IPADDR;
//或者
strcpy(char *,CString);

以上两种编译都是没有问题,但是传参总是只传第一个字符即“1”,头大的很,后面才发现原来是编码格式选择问题。

因为默认新建的vs工程默认工程使用的字符集是“使用Unicode字符集”,选择多字符集就搞定了。

VS C++开发问题总结_第1张图片

自己理解:MFC中Ctring,默认采用unicode编码,而char采用ansi编码,两种编码中单个字符占的存储大小也是不同的,CString属于所谓的宽字符集,占一个字符占两个字节;char类型属于窄字符集,一个char字符占一个字节,所以它们之间的转换涉及到字节大小的转换。

对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ANSI编码与Unicode编码之间最大也最明显的区别。为使计算机支持更多语言,通常使用 0x80~0xFF 范围的多个字节来表示 1 个字符。

UNICODE是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

当然如果坚持用unicode编码也可以用如下方法实现CString和char*的转换:

//实现unicode编码格式下的CString和char*的转换
//#include 
CString m_IPADDR= _T("192.168.1.100");
USES_CONVERSION;
char* ipaddr = T2A(m_IPADDR);

顺便一提:“_T”的含义:_T是一个宏,作用是让你的程序支持Unicode编码。因为Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理像中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。

你可能感兴趣的:(VC++,vs)