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的内容:
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类型的,它提供了一个封装好的类供用户方便地使用。
- Unicode和ANSI编码环境下编译字符串的问题求解
- VS中遇到的 UNICODE和ANSI 编码问题
- ANSI编码和Unicode编码的不同
- ANSI编码和Unicode编码的不同
- ANSI编码和Unicode编码的不同
- ANSI编码和Unicode编码的不同
- vc++6.0 将CString 转换成 Unicode 的字符串,ANSI编码 和 unicode编码 互转
- outlook pst ANSI和UNICODE编码问题
- ANSI和unicode编码
- 字符编码ANSI和Unicode的比较
- Unicode和ANSI字符串
- unicode编码和ansi编码
- Unicode编码和ANSI编码
- UNICODE和ANSI字符串的转换
- UNICODE字符串和ANSI字符的转换
- unicode和ANSI字符串之间的转换
- ANSI字符串和Unicode字符串
- 字符集编码ANSI和UNICODE
- PHP集成环境安装
- UVA10564- Paths through the Hourglass
- 文本分类之情感分析 – 朴素贝叶斯分类器
- 【solr基础教程之二】索引
- HigChart折现图
- Unicode和ANSI编码环境下编译字符串的问题求解
- VB.net 中的sqlhelper
- POJ1426-Find The Multiple
- UVA Firetruck
- SPOJ 3871 GCD Extreme
- Log4j配置详解
- Code Forces 448C Painting Fence 贪心递归
- 快速排序算法及其注意事项
- 反汇编学习