Windows核心编程 第2章读书笔记

 

二.字符和字符串处理


     1.UTF全称Unicode Transformation Format,UTF-16每个字符编码为2字节16位;

     2.在Windows程序中使用UTF-16能改进性能和减少内存消耗;
     自Windows NT起,Windows的所有版本都完全用Unicode来构建,调用Windows函数 时,如果传入一个ANSI字符,那么函数首先把字符串转换为Unicode,再把结果传给操作系统,
如果希望函数返回ANSI字符串,那么操作系统会先把Unicode转换为ANSI字符串,再把结果返回给应用程序;

     3.Microsoft的C/C++编译器定义了一个内建的数据类型wchar_t,表示16位的Unicode字符
      wchar_t  c=L'A';

      4.在Windows头文件WinNT.h中定义:
    typedef char CHAR;   //8-bit
      typedef CHAR *PCHAR;
      typedef CONST CHAR *PCSTR;
-------------------------------------------------------------------------------------------------------
      typedef wchar_t WCHAR;    //16-bit
       typedef WCHAR *PWCHAR;
       typedef CONST WCHAR *PCWSTR;
------------------------------------------------------------------------------------------------------
   在API中经常遇到的参数类型:PCTSTR
      #ifdef UNICODE
      typedef LPCWSTR PCTSTR;
     #else
      typedef LPCSTR PCTSTR;
     #endif
     自己整理一下,果然清晰多了

     5.Windows函数的参数中有字符串,则该函数通常有两个版本,比如            CreateWindowsEx:
     在WinUser.h中,CreateWindowsEx实际上是一个宏
      #ifdef UNICODE
      typedef CreateWindowsEx CreateWindowsExW;
     #else
      typedef CreateWindowsEx CreateWindowsExA;
     #endif


     6.Microsoft开始倾向于某些函数只提供Unicode版本;

    7.C运行库中大多数字符串处理函数不检测长度参数,所以会发生缓冲区溢出;

    8.Windows中常见字符串函数
     int CompareString(
       LCID Locale,
        DWORD dwCmpFlags,
        LPCTSTR lpString1,
        int cchCount1,
        LPCTSTR lpString2,
        int cchCount2
        );
     LCID:locale ID,32位值,用来标识一种语言,这个函数以符号当地语言习惯的方式来比较,得到更有意义的结果
--------------------------------------------------------------
     int CompareStringOrdinal(
         LPCWSTR lpString1,
         int cchCount1,
        LPCWSTR lpString2,
        int cchCount2,
         BOOL bIgnoreCase
       );
     这个函数执行的是码位(code-point)比较,不考虑区域设置,所以速度很快,只支持Unicode字符串;

     9.TCHAR
     当没有定义_UNICODE宏时,TCHAR = char
     当定义了_UNICODE宏时,TCHAR = wchar_t

     10.TEXT是在winnt.h中定义
     举例:TCHAR *ptch = TEXT("This is a const string.");   
     如果使用UNICODE字符集, 则TEXT("This is a const string.")相当于L"This is a      const string.",
      如果使用ASCII集, 则上述字符串相当于“This is a const string.”;

     11.Unicode与ANSI字符串转换
      int WideCharToMultiByte(
        UINT CodePage,
           DWORD dwFlags,
          LPCWSTR lpWideCharStr,
           int cchWideChar,
        LPSTR lpMultiByteStr,
          int cbMultiByte,
          LPCSTR lpDefaultChar,
        LPBOOL lpUsedDefaultChar
        );
-------------------------------------------------------------------------------------------------------
     int MultiByteToWideChar(
        UINT CodePage,
          DWORD dwFlags,
          LPCSTR lpMultiByteStr,
          int cbMultiByte,
       LPWSTR lpWideCharStr,
       int cchWideChar
       );

     12.判断文本是ANSI还是Unicode
     BOOL IsTextUnicode(
      const VOID *lpv,
        int iSize,
       LPINT lpiResult
      );
       此方法并不一定准确。

posted @ 2012-05-16 21:45  Hakunamatata-  阅读(505)  评论(0编辑  收藏  举报