windows核心编程 第2章 字符和字符串处理

咳咳,今天效率低了一点o(︶︿︶)o  决定先快速把这本书看完一遍

1、三种计算机字符集
   计算机字符集可归类为三种,单字节字符集(SBCS)、多字节字符集(MBCS)和宽字符集(即Unicode字符集)。
 
单字节字符集(SBCS):
    单字节字符集,称之为SBCS,它的 所有字符都只有一个字节的长度 。常见字符集有:ASCII码和扩展ASCII码。SBCS字符串由一个零字节结尾,数据类型是char。
 
多字节字符集(MBCS):
汉字字符占两个字节长度而英文字母占一个字节长度。 我们国家利用连续2个扩展ASCII码的扩展区域(0xA0以后)来表示一个汉字,该方法的标准叫GB-2312,之后又扩展出GBK和GB18030。后来,日文、韩文、阿拉伯文、台湾繁体...都使用类似的方法扩展了本地字符集的定义, 现在统一称为 MBCS字符集(多字节字符集,既用多个字节表示一个字符)。其实最常见的还是用2个字节表示一个字符,称为DBCS(双字节字符集)。此类常见字符集有gb2312(中国),big5(中国台湾地区),jis(日本)...。多字节字符集(MBCS)兼容单字节字符集(SBCS),通常并不区分他们。同SBCS一样,MBCS字符串也由一个零字节结尾,数据类型也是char。
    但这个方法是有缺陷的,因为各个国家地区各自定义的字符集免不了会有交集。因此使用GB-2312的软件,就不能在BIG-5的环境下运行(显示乱码)。
 
宽字符集(Unicode字符集):
 为了把全世界所有的文字符号都统一进行编码,于是制定了UNICODE字符集。标准的UNICODE字符集(即UCS-2,又称UTF-16)规定 使用2个字节表示一个字符 ,这下终于好啦,全世界任何一个地区的软件,可以不用修改地就能在另一个地区运行了。Unicode字符数据类型有:WCHAR、_wchar_t、OLECHAR。

 UTF:Unicode Transformation Format
三种编码方式:UTF-8 UTF-16 UTF-32
UTF-8:根据字符的分类,分别用1~4字节来表示一个字符
UTF-32:所有的字符都用4字节表示
UTF-16:用两字节表示大部分语言的字符,当两节字无法表示时通过surrogates四字节表示字符
注:.Net FrameWork用UTF 16对所有字符进行编码,所以当需要在托管和非托管代码间传递字符或字符串时最好用UTF16统一字符的编码方式。这样可以提高程序的性能,节省内存

2、C运行期库对Unicode的支持

#include <String.h>
typedef unsigned short wchar_t;
wchar_t *wcscat(wchar_t*, const wchar_t*);
wchar_t *wcschr(const wchar_t*, wchar_t);

    所有Unicode函数均以wcs开头,wcs是宽字符串的英文缩写,若要使用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。

    TChar.h可以帮助创建ANSI/Unicode通用源代码文件,它包含你应该用在源代码中的一组宏,而不应该直接调用str函数或者wcs函数,如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数,如果没有定义_UNICODE,那么这些宏将引用str这组宏。


3、Windows定义的Unicode数据类型

WCHAR                                                                   Unicode字符
PWSTR                                                                    指向Unicode字符串的指针
PCWSTR                                                                 指向一个恒定的Unicode字符串的指针
PTSTR                                                                     ANSI/Unicode通用数据类型,取决于是否定义了UNICODE宏

Windows字符串函数

    Windows提供了一组范围很广的字符串操作函数。这些函数与C运行期字符串函数很相似,但是它们属于操作系统的一部分,建议最好使用操作系统函数,因为这将有助于稍稍提高你的应用程序的运行性能,操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用,由于这些函数使用得很多,因此,在你的应用程序运行时,它们可能已经被装入RAM。

    Windows提供的字符串操作函数包括:lstrcat lstrcmp lstrcmpi lstrcpy lstrlen,要注意的是这些函数是作为宏来实现的,这些宏既可以调用函数的Unicode版本,也可以调用函数的ANSI版本。



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

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

5、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字符串;


7、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.”;

若程序以Unicode格式编译,则_T会把”你好,MFC“以Unicode格式保存,中英文都被处理。而另一个_L宏则是强制性的以Unicode格式保存(双字节)。_T与_L的区别就在于,一个是适配的,一个是强制的。

#ifdef _UNICODE的时候
_T就是L
没有#ifdef _UNICODE的时候
_T就是ANSI的。

而且MS推荐你使用相匹配的字符串函数。
比如处理LPTSTR或者LPCTSTR 的时候,不要用strlen ,而是要用_tcslen
否则在UNICODE的编译条件下,strlen不能处理 wchar_t*的字符串。
T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?
编译的时候才决定

8、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
       );

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

猜你喜欢

转载自blog.csdn.net/qq1012848571/article/details/51594304
今日推荐