VC中的字符串表示方法

参考资料:

1.http://blog.csdn.net/kybd2006/article/details/1566827

2.http://blog.csdn.net/wskelan/article/details/5017131

首先,因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和wcslen,分别用于处理两种字符串。

(A)CHAR是单字节字符变量,指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位)。对于不同语言,例如中文等表示能力弱;

(B)WCHAR_T是宽字节变量类型,指向Unicode字符,一般为16位或32位,但不同的C或C++库有不同的规定,如GNU Libc规定wchar_t为32位总之,wchar所能表示的字符数远超char型。

(C)TCHAR根据工程字符编译而定:程序编译为 ANSI, TCHAR 就是相当于 CHAR;当程序编译为 UNICODE, TCHAR 就相当于 WCHAR。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,定义宽字节类型方法如下:

wchar_t c = `A' ; 

wchar_t * p = L"Hello!" ; 
wchar_t a[] = L"Hello!" ;

其中,宽字节类型每个变量占用2个字节,故上述数组a的sizeof(a) = 14。

_T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式。如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串. 如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD"。

(D)LP的含义是长指针(long pointer)。LPSTR是一个指向以‘/0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR(并且长指针(LP)和短指针(P)是等价的)。而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。

(E)LPTSTR和LPCTSTR。我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char,业界推出的Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char.然后为了实现两种编码的通用,提出了TCHAR的定义:

如果定义_UNICODE,声明如下:typedef wchar_t TCHAR;

如果没有定义_UNICODE,则声明如下:typedef char TCHAR;

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

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

     LPCTSTR:
     #ifdef _UNICODE
        typedef const wchar_t * LPCTSTR;
     #else
        typedef const char * LPCTSTR;
     #endif

附注1:

如果使用vs2005进行项目工程构建,因为vs2005默认使用unicode字符,所以不能使用char,而应该用TCHAR。因此,需要设置该工程属性:project->properties->configurationsProperties -> General ->Project Defaults -> Charater Set中将Unicode字符集改为未设置即可。

附注2:各种字符之间的转换

1,string -> CString  
CString.format("%s", string.c_str());  用c_str()确实比data()要好.  

2,char -> string  

string s(char *);  你的只能初始化,在不是初始化的地方最好还是用assign().  

3,CString -> string  
string s(CString.GetBuffer()); GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.   
有三个函数可以将字符串的内容转换为字符数组和Cstring:

1.data(),返回没有”\0“的字符串数组  

2,c_str(),返回有”\0“的字符串数组  

3,copy()   
4、int转为CString  
而将数字转换为CString变量,可以使用CString的Format函数。如  CString s;  int i = 64;  
s.Format("%d", i)  
数字->字符串除了用CString::Format,还有FormatV、sprintf和不需要借助于Afx的itoa 
5、CString转换 char[100]  char a[100];  
CString str("aaaaaa");  
strncpy(a,(LPCTSTR)str,sizeof(a)); Format函数的功能很强,值得你研究一下。 

6、CString类型的转换成int 
CString类型的转换成int :     将字符转换为整数,可以使用atoi、_atoi64或atol。  
//CString aaa = "16"   
//int int_chage = atoi((lpcstr)aaa)  

7、string转成”const char *” string aa("aaa");  
const char *c=aa.c_str(); 

8、string转成” char *” 
要用strcpy(),不能用string.c_str() string mngName;  
char t[200]; memset(t,0,200); strcpy(t,mngName.c_str()); 

9、 char*转为int  #include  
int atoi(const char *nptr);  long atol(const char *nptr);  
long long atoll(const char *nptr);  long long atoq(const char *nptr);

你可能感兴趣的:(C/C++/VC)