Chapter02-VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用

一、 在字符串前加一个L 作用    

如 L"我的字符串"表示将ANSI字符串转换成unicode

的字符串,就是每个字符占用两个字节。   

strlen("asd")   =   3;     

strlen(L"asd")   =   6;

二、  _T 宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目

标环境选择合适的(Unicode还是ANSI)字符处理方式    

a) 如果你定义了UNICODE那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 

     相当于 L"ABCD" ,这是宽字符串。

b) 如果没有定义,那么_T宏不会在字符串前面加那个L_T("ABCD") 就等价于 "ABCD"

三、TEXT,_TEXT  _T  一样的

如下面三语句:     

TCHAR   szStr1[]   =   TEXT("str1");     

char   szStr2[]   =   "str2";     

WCHAR   szStr3[]   =   L("str3");  

那么第一句话在定义了UNICODE时会解释为第三句话,没有定义时就等于第二句话。

但第二句话无论是否定义了UNICODE都是生成一个ANSI字符串,而第三句话总是生

成UNICODE字符串。为了程序的可移植性,建议都用第一种表示方法。但在某些情况

下,某个字符必须为ANSIUNICODE,那就用后两种

四、Windows编程中各种字符串类型
Windows定义的Unicode数据类型有:
  WCHAR                                         Unicode字符
  PWSTR                                         指向Unicode字符串的指针
  PCWSTR                                       指向一个恒定的Unicode字符串的指针
相对应的ANSI数据类型有:
  CHAR                                           ANSI字符
  PSTR                                         指向ANSI字符串的指针
  PCSTR                                       指向一个恒定的ANSI字符串的指针
通用的字符数据类型:
  TCHAR
  PTSTR
  PCTSTR
 
其 中TCHAR的定义位于类TChar.h中,需要定义宏_UNICODE才能调用unicode数据类型。 PTSTR,PCTST的定义位于 Windows.h头文件中,需要定义宏UNICODE才能调用unicode数据类型。因此当同时调用windows.h和TChar.h文件且需要用 到unicode编码时,需要同时定义宏_UNICODE和宏UNICODE。
 
注:
1.为了程序的兼容性,一般调用通用字符类型。并且建议最好使用操作系统函数,而不要使用C运行期字符串函数。这将有助于稍稍提高你的应用程序的运行性能。
2.当将字符串地址附值给TCHAR指针变量时需要的格式为
TCHAR* pszError = _TEXT("error");
因为如果不加_TEXT,默认“"error"为ANSI编码.
3. 当为用户提供dll链接库时需要定义一套既适合unicode又适合ANSI的代码。一般是在ANSI的函数中将ANSI的参数转换为UNICODE的参 数再调用UNICODE的函数。如windows提供的函数CreateWindowExA和CreateWindowExW。另外Windows还定义 了一个宏CreateWindowEx,其定义如下:
#ifdef unicode
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif
4. 当 计算字符个数时应该调用sizeof(szBuffer)/sizeof(TCHAR), 而不是sizeof(szBuffer),分配内存时应该调用 malloc(nCharacters *sizeof(TCHAR)), 而不是调用malloc(nCharacters )。
5._countof宏可获得字符串的字符数,sizeof可获得字符串的字节数。
1. 为了兼容性可以调用以下函数来处理字符:
  lstrcat 将一个字符串置于另一个字符串的结尾处
       lstrcmp  对两个字符串进行区分大小写的比较
       lstrcmpi 对两个字符串进行不区分大小写的比较
       lstrcpy 将一个字符串拷贝到内存中的另一个位置
       lstrlen 返回字符串的长度(按字符数来计量)
PTSTR CharLower(PTSTR pszString)
PTSTR CharUpper(PTSTR pszString)
DWORD CharLowerBuff(PTSTR pszString,DWORD cchString)
DWORD CharUpperBuff(PTSTR pszString,DWORD cchString)
BOOL IsCharAlpha(TCHAR ch);
BOOL IsCharAlphaNumeric(TCHAR ch)
BOOL IsCharLower(TCHAR ch)
BOOL IsCharUpper(TCHAR ch)
sprintf(PTSTR, PTSTR, PTSTR)
注: (1).CharLower,CharUpper,CharLowerBuff,CharUpperBuff这几个函数还可以用来处理一个字符,方法如下:TCHAR cLowerCaseChar= CharLower((PTSTR)szString[0])
     (2).CharUpper 和CharUpperBuff的区别是charUpperBuff用于处理缓冲区的数据(该缓冲区不必以0结尾)
     
2其他函数:
DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb, PINT pResult);(此函数用于判断文本文件的编码类型)
int WideCharToMultiByte(UINT uCodePage, DWORD dwFlags,PCWSTR pWideCharStr,
       int cchWideChar,PSTR pMultiByteStr,int cchMultiByte,PCSTR    pDefaultChar,PBOOL pfUDC)
int MultiByteToWideChar(UINT uCodePage, DWORD dwFlags,PSTR pMultiByteStr,
       int  cchMultiByte,,PCWSTR pWideCharStr,int cchWideChar)
函数MultiByteToWideChar的使用方法:
1) 调用MultiByteToWideChar函数,为pWideCharStr参数传递NULL,为cchWideChar参数传递0。
       2) 分配足够的内存块,用于存放转换后的Unicode字符串。该内存块的大小由前面对MultiByteToWideChar的调用返回。
       3) 再次调用MultiByteToWideChar,这次将缓存的地址作为pWideCharStr参数来传递,并传递第一次调用MultiByteToWideChar时返回的        缓存大小,作为cchWideChar参数。
       4) 使用转换后的字符串。
       5) 释放Unicode字符串占用的内存块。
3 .安全字符串函数
C运行库中现有的字符串处理函数(如_tcscpy宏后面的那些函数)已被标记废弃不用。如果使用了这些函数,编译器就会发出警告。
取而代之的是安全字符串函数,例如:
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strSource );
这些安全的字符串函数在将一个可写的缓冲区作为参数传递时,必须同时提供他的大小。这个值应该是一个字符数。通过对缓冲区使用_countof宏(在stdlib.h中定义),我们很容易计算出这个值。

ps:1.使用上面这些安全的字符串函数的时候必须包含头文件StrSafe.h。同时String.h也会自动被包含进来。

    2.必须包含其他所有文件之后才包含StrSafe.h。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值