windows字符和字符串处理

windows字符和字符串处理

Windows定义的Unicode数据类型有:

  WCHAR                     Unicode字符

  PWSTR                     指向Unicode字符串的指针

  PCWSTR                    指向一个恒定的Unicode字符串的指针

相对应的ANSI数据类型有:

  CHAR                      ANSI字符

  PSTR                     指向ANSI字符串的指针

  PCSTR                    指向一个恒定的ANSI字符串的指针

通用的字符数据类型:

  TCHAR              记忆方法:T--对应_T()宏   P--Point,指针  STR--string

  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);  判断一个字符是否在ASCII表中

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章