• 移植性问题のCString类型转换,字符串操作和UNICODE、ANSI字符集


    一.CString与LPCWSTR

        两者的不同:LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。

        CString转换成LPCWSTR

        方法一:CString strFileName;

                         LPCWSTR lpcwStr = strFileName.AllocSysString();

        方法二:CString str=_T("TestStr");                     USES_CONVERSION;                     LPCWSTR lpcwStr = A2CW((LPCSTR)str);

        MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR)  -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。

        LPCWSTR转换成CString

        LPCWSTR lpcwStr = L"TestWStr";     CString str(lpcwStr);

    二.CString与LPSTR转换

         CString转换成LPSTR:

        方法一:CString strFileName;

                       LPSTR lpStr = strFileName.GetBuffer();

                        strFileName.ReleaseBuffer();

         方法二:CString strFileName;

                         LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;

          LPSTR转换成CString:

                          LPSTR lpStr = L"TestStr";                       CString str(lpStr);

          注意:CString和LPCSTR可直接转换,如下:

                         CString str;

                         LPCSTR lpcStr = (LPCSTR)str;

    三.CString和char*转换        CString转换成char*        方法一:CString str;                        char* p = str.GetBuffer();        方法二:CString str;                        char* p = (LPSTR)(LPCSTR)str;        char*转换成CString                        char* p = "test";                        CString str = ("%s",p);

    四.String和int、float的转换

            可以使用atoi,atof,atol等函数来完成。

    五.LPSTR(char*)和LPWSTR的转换

            可以使用下面的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();

    void Func1(LPSTR lpStr);

    void Func2(LPWSTR lpwStr);

    TCHAR   name[256];

    TCHAR*   pName = new  TCHAR[256];

    Func1(name); // Func1(pName);

    Func2(name); // Func2(pName);

    注意在VS2005中上面用红色标记的代码已经不成立。

    VS2005中CString已经改为宽字符型,一些转换如下:

    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();

    可以看出转换更加简单了,基本上可以直接转换,A2W等宏基本上不需要啦

    五、  有关相关字符串操作

    字符集特性:

    ANSI 操作函数以str开头 strcpy Unicode 操作函数以wcs开头 wcscpy MBCS 操作函数以_mbs开头 _mbscpy ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库) ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数) 所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义: #ifdef UNICODE #define CreateWindowEx CreateWindowExW #else #define CreateWindowEx CreateWindowExA #endif // !UNICODE 

    有关UNICODE、ANSI字符集和相关字符串操作,请看下面的网页 :

    http://blog.csdn.net/archimedes_zht/archive/2008/04/18/2305923.aspx

  • 相关阅读:
    【野生程序员】:优先招聘
    C#-面向对象:争议TDD(测试驱动开发)
    培训班的同学,拜托不要把用人单位想得那么傻,好不好?!
    为什么要讲数据结构和算法?以及如何学习数据结构和算法
    关于办技术线下社区的一些思考
    做了十年的程序员,为什么我没有加班
    编程新手如何理解“面向对象”
    .NET程序员不加班——写在《华为工程师猝死,36岁,22月无休》之后
    “6年的程序员还不会写委托”,问题在哪?
    现身说法:37岁老码农找工作
  • 原文地址:https://www.cnblogs.com/lzhitian/p/2348598.html
Copyright © 2020-2023  润新知