找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4399|回复: 0

CString类型转换,字符串操作和UNICODE、ANSI字符集

[复制链接]
发表于 2011-12-25 20:13:12 | 显示全部楼层 |阅读模式
一.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已经改为宽字符型,一些转换如下:
  1. char name[10];
  2. TCHAR sex[5] ;
  3. char *p = name;
  4. TCHAR *pw =
  5. sex;
  6. LPSTR lpstr = name;
  7. LPCSTR lpcstr = name;
  8. lpcstr =
  9. lpstr;
  10. lpstr = p;
  11. p = (char*)sex;
  12. pw = (WCHAR*)name;
  13. LPWSTR
  14. lpwstr = (LPWSTR)lpstr;
  15. lpwstr = (LPWSTR)lpcstr;
  16. LPCWSTR lpcwstr =
  17. (LPCWSTR)lpstr;
  18. lpcwstr = (LPCWSTR)name;
  19. CString str(lpstr);
  20. CString str1(lpcstr);
  21. CString
  22. str2(lpwstr);
  23. CString str3(lpcwstr);
  24. CString str4(name);
  25. CString
  26. str5(sex);
  27. lpwstr = (LPWSTR)(LPCWSTR)str;
  28. lpstr = (LPSTR)(LPCWSTR)str;
  29. lpcstr =
  30. (LPCSTR)(LPCWSTR)str;
  31. p = (char*)str.GetBuffer();
  32. 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  


作者:kingmax54212008 发表于2011-12-25 16:45:56 原文链接
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-4 03:54 , Processed in 0.013155 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表