• Unicode


    LPTSTR、LPCSTR、LPSTR、LPCTSTR、LPWSTR、LPCWSTR:
     
     
    L 表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
    P 表示这是一个指针
    C 表示是一个常量
    T 表示在Win32环境中, 有一个_T宏
    STR 表示这个变量是一个字符串
     
    LPSTR:32-bit指针,指向一个字符串,每个字符占1字节char
    LPCSTR: 32-bit指针,指向一个常字符串,每个字符占1字节char
    LPTSTR::32-bit指针,每字符可能占1字节或2字节,取决于Unicode是否定义  TCHAR
    LPCTSTR::32-bit指针,指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义 TCHAR
    LPWSTR:32-bit指针,每字符占2字节,数据类型为16位的wchar_t
    LPCWSTR::32-bit指针,指向一个常字符串,每字符占2字节,数据类型为16位的wchar_t
     
    Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。
     
    MS推荐你使用相匹配的字符串函数,比如处理LPTSTR或者LPCTSTR 的时候,不要用strlen ,而是要用_tcslen,否则在UNICODE的编译条件下,strlen不能处理 wchar_t*的字符串。
     
    char*  是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容;
    LP的含义是长指针(long   pointer),LPSTR是一个指向以‘’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
     
    数据类型转换:
     
    CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。
     
    可以使用下面的ATL宏来进行,最好是将变量定义成TCHAR、LPTSTR等T类型,可以避免转换。

    ATL宏介绍:

         A2BSTR   OLE2A             T2A            W2A 
         A2COLE   OLE2BSTR    T2BSTR    W2BSTR 
         A2CT         OLE2CA         T2CA          W2CA 
         A2CW        OLE2CT         T2COLE    W2COLE 
         A2OLE       OLE2CW       T2CW         W2CT 
         A2T            OLE2T            T2OLE        W2OLE 
         A2W           OLE2W          T2W             W2T

     
        A :ANSI 字符串,也就是 MBCS。 
        W、OLE 宽字符串,也就是 UNICODE。 
        T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A 
        C const 的缩写
         利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
        1、只适合于进行短字符串的转换; 
        2、不要试图在一个次数比较多的循环体内进行转换; 
        3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的; 
        4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();
     
    转换示例:
     char name[10];
     TCHAR sex[5] ;
     char *p = name;
     TCHAR *pw = sex;
     LPSTR lpstr = name;
     LPCSTR lpcstr = name;
     lpcstr = lpstr;
     
     lpstr = p;
     p = (char*)sex;
     pw = (WCHAR*)name;
     LPWSTR lpwstr = (LPWSTR)lpstr;
     lpwstr = (LPWSTR)lpcstr;
     LPCWSTR lpcwstr = (LPCWSTR)lpstr;
     lpcwstr = (LPCWSTR)name;
     CString str(lpstr);
     CString str1(lpcstr);
     CString str2(lpwstr);
     CString str3(lpcwstr);
     CString str4(name);
     CString str5(sex);
     lpwstr = (LPWSTR)(LPCWSTR)str;
     lpstr = (LPSTR)(LPCWSTR)str;
     lpcstr = (LPCSTR)(LPCWSTR)str;
     p = (char*)str.GetBuffer();
     pw = str.GetBuffer();
     
    CString转换成LPSTR另一种方式:
    CString strFileName;
    LPSTR lpStr = strFileName.GetBuffer();
    strFileName.ReleaseBuffer();
     
    在数据库里,有n前缀的字串类型就是UNICODE类型,这种类型中,固定用两个字节来表示一个字符,无论这个字符是汉字还是英文字母,或是别的什么。 
    如果你要测试"abc汉字"这个串的长度,在没有n前缀的数据类型里,这个字串是7个字符的长度,因为一个汉字相当于两个字符。而在有n前缀的数据类型里,同样的测试串长度的函数将会告诉你是5个字符,因为一个汉字就是一个字符。
  • 相关阅读:
    Android布局尺寸思考
    正则表达式五分钟快速复习
    git gitignore文件失效处理
    华为手机Edittext光标(cursor)颜色修改
    AndroidStudio-OSX 常用快捷键整理
    OS X(EI Capitan)常用快捷键整理
    通过Foxit和坚果云实现iPad和PC的pdf同步阅读(修改,笔记)
    《程序员必读的职业规划书》职业生涯规划部分书摘及感想
    以神经网络使用为例的Matlab和Android混合编程
    写出优美代码的两个方式:一步到位VS迭代优化
  • 原文地址:https://www.cnblogs.com/yunqie/p/6055335.html
Copyright © 2020-2023  润新知