Unicode和ANSI编码环境下编译字符串的问题求解

来源:互联网 发布:中国农业银行软件 编辑:程序博客网 时间:2024/05/17 02:32

利用C/C++编程时,常常因为对字符串的不规范的操作导致许多让初学者感到莫名其妙的编译错误,查来查去,原来是编码方式的问题,解决办法是在 “项目” ->“属性”中设置使用适当的字符集,如把原来的“Use Unicode Character Set”改为 “Not Set”,等等。这里的缘由到底是什么?本文做一简单探究。

简单说,Unicode和ANSI是两种不同的字符编码方式(详情见百度),我们使用的字符串类型有的是Unicode编码格式的,有的是ANSI编码格式的,没有区分地随意操作字符串时,编译错误便产生了。

关于此,更详细地,我们引用http://blog.sina.com.cn/s/blog_6da8e3ef0101c1y2.html的内容:


如果设置为“使用 Unicode 字符集”,那么这个意思就是告诉编译器将会以Unicode方式来编译程序代码;
VC2005中默认使用Unicode编码,也主是说编译器默认用Unicode方式来编译程序,我们在程序当中经常使用字符串操作,比如char,wchar_t,MFC的CString类都是对字符串操作的,但char是ANSI的,wchar_t是宽字符可以存储Unicode,CString 则封装了wchar_t,我们可以看到CString对应的字符串应该是TCHARTCHAR的定义是这样的
typedef wchar_t TCHAR    ;   #else   typedef char TCHAR;   #endif </span>

也就是说当使用Unicode时CString是wchar_t类使用非Unicode时,CString被映射成char,刚才我们说了VS2005是使用Unicode编码的,有CString会被映射成wchar_t类型,所以们有操作存储CString类的字符时就要注意将需要存储的字符串转换成wchar_t类型,比如用_T("")来操作。


事实上,关于此类错误,在C++中最常见的一个是CString和LPCTSTR的使用错误,另一篇博文对此作出了很好的解析http://www.cnblogs.com/CBDoctor/archive/2012/09/11/2679622.html


CString LPCTSTR区别联系
CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。

CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
typedef OLECHAR FAR* BSTR;
typedef const char * LPCTSTR;

vc++中各种字符串的表示法
首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。


LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。

而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.
2.C表示const
3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.

LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。

LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。

CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。

0 0
原创粉丝点击