要在Unicode字符集环境下把CString转化为char*

方法:

CString str = _T("D://校内项目//QQ.bmp");//////leo这个NB  可以降在Unicode下的CString转化为char*
    //声明标识符
    USES_CONVERSION;
    //调用函数,T2A和W2A均支持ATL和MFC中的字符转换
    char * pFileName = T2A(str);  
    //char * pFileName = W2A(str); //也可实现转换

在Visual C++.NET2005中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi- Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2005环境下运行时会报各种各样的错误,这里总结了在Visual C++.NET2005环境中Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。

1、Unicode下CString转换为char *

方法一:使用API:WideCharToMultiByte 进 行转换

CString str = _T("D://校内项目//QQ.bmp");

//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
              int n = str.GetLength();     // n = 14, len = 18

//获取宽字节字符的大小,大小是按字节计算的
             int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
            char * pFileName = new char[len+1];   //以字节为单位

//宽字节编码转换成多字节编码
            WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);

pFileName[len+1] = '/0';    //多字节字符以'/0'结束

方法二:使用函数:T2A、W2A

CString str = _T("D://校内项目//QQ.bmp");

//声明标识符
             USES_CONVERSION;

//调用函数,T2A和W2A均支持ATL和MFC中的字符转换
             char * pFileName = T2A(str);    
             //char * pFileName = W2A(str); //也可实现转换

注意:有时候可能还需要添加引用#include   <afxpriv.h>

2、Unicode下char *转换为CString

方法一:使用API:MultiByteToWideChar 进 行转换

char * pFileName = "D://校内项目//QQ.bmp";

//计算char *数组大小,以字节为单位,一个汉字占两个字节
             int charLen = strlen(pFileName);

//计算多字节字符的大小,按字符计算。
             int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);

//为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
             TCHAR *buf = new TCHAR[len + 1];

//多字节编码转换成宽字节编码
              MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);

buf[len] = '/0'; //添加字符串结尾,注意不是len+1

//将TCHAR数组转换为CString
              CString pWideChar;
              pWideChar.Append(buf);

//删除缓冲区
             delete []buf;

方法二:使用函数:A2T、A2W

char * pFileName = "D://校内项目//QQ.bmp";

USES_CONVERSION;
              CString s = A2T(pFileName);

//CString s = A2W(pFileName);

方法三:使用_T宏 ,将字符串转换为宽字符

//多字节字符集,在vc6和vc7种可以编译通过的语句,但VS2005不能通过,默认为Unicode字符集
            //AfxMessageBox("加载数据失败",0);

//书写代码使用TEXT("")或_T(""),文本在UNICODE和非UNICODE程序里都通用
            AfxMessageBox(_T("加载数据失败"),0);

注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数 据,强制类型转换只会返回第一个字符。

作者:程佩君   CString和int相互转换

EVC下只支持UNICODE,所以方法如下:   
  CString   To   int:   
  CString   strMytry   =   _T("123");   
  int   iMytry   =   -1;   
  swscanf(strMytry,_T("%d"),&iMytry);   
    
  int   to   CString:   
  int   iMytry   =   -1;   
  CString   strMyTry   =   _T("");   
  strMytry.Format(_T("%d"),iMytry);

sscanf, swscanf 函数解说
Read formatted data from a string.

int sscanf( const char *buffer, const char *format [, argument ] ... ); 
int swscanf( const wchar_t *buffer, const wchar_t *format [, argument ] ... );

-----------------------------------------------------------

CStrin转为 _bstr_t 的方法。
    CString   cs="aaa";   
  _bstr_t   bstr   =   cs.AllocSysString   ();

--------------------------------------------------------------------------------   
  读者层次:初学   
    
  刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。   
    
  我们先定义一些常见类型变量借以说明   
    
  int   i   =   100;   
  long   l   =   2001;   
  float   f=300.2;   
  double   d=12345.119;   
  char   username[]="女侠程佩君";   
  char   temp[200];   
  char   *buf;   
  CString   str;   
  _variant_t   v1;   
  _bstr_t   v2;   
    
  一、其它数据类型转换为字符串   
    
    
  短整型(int)   
  itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制   
  itoa(i,temp,2);   ///按二进制方式转换     
  长整型(long)   
  ltoa(l,temp,10);   
    
    
  二、从其它包含字符串的变量中获取指向该字符串的指针   
    
    
  CString变量   
  str   =   "2008北京奥运";   
  buf   =   (LPSTR)(LPCTSTR)str;     
  BSTR类型的_variant_t变量   
  v1   =   (_bstr_t)"程序员";   
  buf   =   _com_util::ConvertBSTRToString((_bstr_t)v1);   
    
  三、字符串转换为其它数据类型   
  strcpy(temp,"123");     
    
  短整型(int)   
  i   =   atoi(temp);     
  长整型(long)   
  l   =   atol(temp);     
  浮点(double)   
  d   =   atof(temp);   
    
  四、其它数据类型转换到CString   
  使用CString的成员函数Format来转换,例如:   
    
    
  整数(int)   
  str.Format("%d",i);     
  浮点数(float)   
  str.Format("%f",i);     
  字符串指针(char   *)等已经被CString构造函数支持的数据类型可以直接赋值   
  str   =   username;   
    
  五、BSTR、_bstr_t与CComBSTR   
    
    
  CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。   
  char   *转换到BSTR可以这样:   BSTR   b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h   
  反之可以使用char   *p=_com_util::ConvertBSTRToString(b);   
    
    
  六、VARIANT   、_variant_t   与   COleVariant   
    
    
  VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。   
  对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:   
  VARIANT   va;   
  int   a=2001;   
  va.vt=VT_I4;///指明整型数据   
  va.lVal=a;   ///赋值   
    
  对于不马上赋值的VARIANT,最好先用Void   VariantInit(VARIANTARG   FAR*   pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:   
    
  Byte   bVal;     //   VT_UI1.     
  Short   iVal;     //   VT_I2.     
  long   lVal;     //   VT_I4.     
  float   fltVal;     //   VT_R4.     
  double   dblVal;     //   VT_R8.     
  VARIANT_BOOL   boolVal;     //   VT_BOOL.     
  SCODE   scode;     //   VT_ERROR.     
  CY   cyVal;     //   VT_CY.     
  DATE   date;     //   VT_DATE.     
  BSTR   bstrVal;     //   VT_BSTR.     
  DECIMAL   FAR*   pdecVal     //   VT_BYREF|VT_DECIMAL.     
  IUnknown   FAR*   punkVal;     //   VT_UNKNOWN.     
  IDispatch   FAR*   pdispVal;     //   VT_DISPATCH.     
  SAFEARRAY   FAR*   parray;     //   VT_ARRAY|*.     
  Byte   FAR*   pbVal;     //   VT_BYREF|VT_UI1.     
  short   FAR*   piVal;     //   VT_BYREF|VT_I2.     
  long   FAR*   plVal;     //   VT_BYREF|VT_I4.     
  float   FAR*   pfltVal;     //   VT_BYREF|VT_R4.     
  double   FAR*   pdblVal;     //   VT_BYREF|VT_R8.     
  VARIANT_BOOL   FAR*   pboolVal;     //   VT_BYREF|VT_BOOL.     
  SCODE   FAR*   pscode;     //   VT_BYREF|VT_ERROR.     
  CY   FAR*   pcyVal;     //   VT_BYREF|VT_CY.     
  DATE   FAR*   pdate;     //   VT_BYREF|VT_DATE.     
  BSTR   FAR*   pbstrVal;     //   VT_BYREF|VT_BSTR.     
  IUnknown   FAR*   FAR*   ppunkVal;     //   VT_BYREF|VT_UNKNOWN.     
  IDispatch   FAR*   FAR*   ppdispVal;     //   VT_BYREF|VT_DISPATCH.     
  SAFEARRAY   FAR*   FAR*   pparray;     //   VT_ARRAY|*.     
  VARIANT   FAR*   pvarVal;     //   VT_BYREF|VT_VARIANT.     
  void   FAR*   byref;     //   Generic   ByRef.     
  char   cVal;     //   VT_I1.     
  unsigned   short   uiVal;     //   VT_UI2.     
  unsigned   long   ulVal;     //   VT_UI4.     
  int   intVal;     //   VT_INT.     
  unsigned   int   uintVal;     //   VT_UINT.     
  char   FAR   *   pcVal;     //   VT_BYREF|VT_I1.     
  unsigned   short   FAR   *   puiVal;     //   VT_BYREF|VT_UI2.     
  unsigned   long   FAR   *   pulVal;     //   VT_BYREF|VT_UI4.     
  int   FAR   *   pintVal;     //   VT_BYREF|VT_INT.     
  unsigned   int   FAR   *   puintVal;     //VT_BYREF|VT_UINT.     
    
    
  _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。   
  使用时需加上#include   <comdef.h>   
  例如:   
  long   l=222;   
  ing   i=100;   
  _variant_t   lVal(l);   
  lVal   =   (long)i;   
    
    
  COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:   
  COleVariant   v3   =   "字符串",   v4   =   (long)1999;   
  CString   str   =(BSTR)v3.pbstrVal;   
  long   i   =   v4.lVal;   
    
    
  七、其它   
    
  对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:   
  LPARAM   lParam;   
  WORD   loValue   =   LOWORD(lParam);///取低16位   
  WORD   hiValue   =   HIWORD(lParam);///取高16位     
  对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:   
  WORD   wValue;   
  BYTE   loValue   =   LOBYTE(wValue);///取低8位   
  BYTE   hiValue   =   HIBYTE(wValue);///取高8位

strData.format("%.nlf",data);   
  n为小数位数

BSTR、char*和CString转换

(1) char*转换成CString

  若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:

view plaincopy to clipboardprint?
char chArray[] = "This is a test";   
char * p = "This is a test";   
char chArray[] = "This is a test";
char * p = "This is a test";

  或

view plaincopy to clipboardprint?
LPSTR p = "This is a test";   
LPSTR p = "This is a test";

  或在已定义Unicode应的用程序中

view plaincopy to clipboardprint?
TCHAR * p = _T("This is a test");  
TCHAR * p = _T("This is a test");

  或

view plaincopy to clipboardprint?
LPTSTR p = _T("This is a test");   
CString theString = chArray;   
theString.Format(_T("%s"), chArray);   
theString = p;   
LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;

(2) CString转换成char*

  若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

  方法一,使用强制转换。例如:

view plaincopy to clipboardprint?
CString theString( "This is a test" );   
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;   
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

  方法二,使用strcpy。例如:

view plaincopy to clipboardprint?
CString theString( "This is a test" );   
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];   
_tcscpy(lpsz, theString);   
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);

  需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。

  方法三,使用CString::GetBuffer。例如:

view plaincopy to clipboardprint?
CString s(_T("This is a test "));   
LPTSTR p = s.GetBuffer();    
// 在这里添加使用p的代码   
if(p != NULL) *p = _T('/0');   
s.ReleaseBuffer();    
// 使用完后及时释放,以便能使用其它的CString成员函数   
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer(); 
// 在这里添加使用p的代码
if(p != NULL) *p = _T('/0');
s.ReleaseBuffer(); 
// 使用完后及时释放,以便能使用其它的CString成员函数

(3) BSTR转换成char*

  方法一,使用ConvertBSTRToString。例如:

view plaincopy to clipboardprint?
#include    
#pragma comment(lib, "comsupp.lib")   
int _tmain(int argc, _TCHAR* argv[]){   
BSTR bstrText = ::SysAllocString(L"Test");   
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);   
SysFreeString(bstrText); // 用完释放   
delete[] lpszText2;   
return 0;   
}   
#include 
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完释放
delete[] lpszText2;
return 0;
}

  方法二,使用_bstr_t的赋值运算符重载。例如:

view plaincopy to clipboardprint?
_bstr_t b = bstrText;   
char* lpszText2 = b;   
_bstr_t b = bstrText;
char* lpszText2 = b;

(4) char*转换成BSTR

  方法一,使用SysAllocString等API函数。例如:

view plaincopy to clipboardprint?
BSTR bstrText = ::SysAllocString(L"Test");   
BSTR bstrText = ::SysAllocStringLen(L"Test",4);   
BSTR bstrText = ::SysAllocStringByteLen("Test",4);   
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);

  方法二,使用COleVariant或_variant_t。例如:

view plaincopy to clipboardprint?
//COleVariant strVar("This is a test");   
_variant_t strVar("This is a test");   
BSTR bstrText = strVar.bstrVal;   
//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;

  方法三,使用_bstr_t,这是一种最简单的方法。例如:

view plaincopy to clipboardprint?
BSTR bstrText = _bstr_t("This is a test");   
BSTR bstrText = _bstr_t("This is a test");

  方法四,使用CComBSTR。例如:

view plaincopy to clipboardprint?
BSTR bstrText = CComBSTR("This is a test");   
BSTR bstrText = CComBSTR("This is a test");

  或

view plaincopy to clipboardprint?
CComBSTR bstr("This is a test");   
BSTR bstrText = bstr.m_str;   
CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;

  方法五,使用ConvertStringToBSTR。例如:

view plaincopy to clipboardprint?
char* lpszText = "Test";   
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);   
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);

(5) CString转换成BSTR

  通常是通过使用CStringT::AllocSysString来实现。例如:

view plaincopy to clipboardprint?
CString str("This is a test");   
BSTR bstrText = str.AllocSysString();   
…   
SysFreeString(bstrText); // 用完释放  
CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); // 用完释放

(6) BSTR转换成CString

  一般可按下列方法进行:

view plaincopy to clipboardprint?
BSTR bstrText = ::SysAllocString(L"Test");   
CStringA str;   
str.Empty();   
str = bstrText;   
BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;

  或

view plaincopy to clipboardprint?
CStringA str(bstrText);   
CStringA str(bstrText);

(7) ANSI、Unicode和宽字符之间的转换

  方法一,使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。

  方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。例如:

view plaincopy to clipboardprint?
TCHAR tstr[] = _T("this is a test");   
wchar_t wszStr[] = L"This is a test";   
String* str = S”This is a test”;   
TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;

  方法三,使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:

  其中,第一个C表示“类”,以便于ATL 3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、 T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如,CA2CT就是将ANSI转换成一般类型的字符串常量。下面是一些示例代码:

view plaincopy to clipboardprint?
LPTSTR tstr= CA2TEX<16>("this is a test");   
LPCTSTR tcstr= CA2CT("this is a test");   
wchar_t wszStr[] = L"This is a test";   
char* chstr = CW2A(wszStr);   
LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);

结语

  几乎所有的程序都要用到字符串,而Visual C++.NET由于功能强大、应用广泛,因而字符串之间的转换更为频繁。本文几乎涉及到目前的所有转换方法。当然对于.NET框架来说,还可使用 Convert和Text类进行不同数据类型以及字符编码之间的相互转换。

C++中各种数据量类型转换的更多相关文章

  1. spark查看DF的partition数目及每个partition中的数据量【集群模式】

    println("--------------------"+data.rdd.getNumPartitions) // 获取DF中partition的数目 val partiti ...

  2. Python统计数据库中的数据量【含MySQL、Oracle】

    Python程序文件如下: # -*- coding: utf-8 # File : start.py # Author : baoshan import json import pymysql im ...

  3. 浅谈 JavaScript 中常用数据及其类型转换

    在 JavaScript 中有一些 value 会经常碰到: [] (空数组).{} (空对象).'' (空字符串).undefined.null.0.NaN.Infinite 也会经常碰到数据类型转 ...

  4. mysql 表格中的数据量过大,修改数据库字段信息会花费很长的时间

    遇到几百万的数据操作遇到很多问题,比如分区,比如分表,sql语句的效率问题.努力学习好mysql优化还是很有必要的.

  5. Oracle数据库--解决单张表中数据量巨大(大数据、数据量上百万级别,后查询,更新数据等耗时剧增)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/QQ578473688/article/details/54561397 思路1:采用备份表 备份表中 ...

  6. Python-统计目录(文件夹)中Excel文件个数和数据量

    背景:前一阵子在帮客户做Excel文件中的数据处理,但是每周提交周报,领导都需要统计从客户接收的文件数量以及记录数.所以我就简单写了统计的脚本,方便统计目录(文件夹)中的Excel文件个数和数据量. ...

  7. 关于webservice大数据量传输时的压缩和解压缩

    当访问WebSerivice时,如果数据量很大,传输数据时就会很慢.为了提高速度,我们就会想到对数据进行压缩.首先我们来分析一下. 当在webserice中传输数据时,一般都采用Dataset进行数据 ...

  8. sql 数据量高并发的数据库优化(转)

    Mysql 大数据量高并发的数据库优化 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实 ...

  9. J2EE综合:如何处理大数据量的查询

    在实际的任何一个系统中,查询都是必不可少的一个功能,而查询设计的好坏又影响到系统的响应时间和性能这两个要害指标,尤其是当数据量变得越来越大时,于是如何处理大数据量的查询成了每个系统架构设计时都必须面对 ...

随机推荐

  1. Android 使用XmlSerializer生成xml文件

    在Android开发中,我们时常要用到xml文件. xml作为一种数据载体,在数据传输中发挥着重要的作用,而且它可读性比较强. 下面给出在Android开发中使用XmlSerializer类生成一个简 ...

  2. 【HDU 5456】 Matches Puzzle Game (数位DP)

    Matches Puzzle Game Problem Description As an exciting puzzle game for kids and girlfriends, the Mat ...

  3. php Laravel 框架 介绍及安装

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  4. Apache Struts 安全措施绕过漏洞(CVE-2013-4310)

    漏洞版本: Apache Group Struts < 2.3.15.2 漏洞描述: BUGTRAQ ID: 62584 CVE(CAN) ID: CVE-2013-4310 Struts2 是 ...

  5. Spark SQL JSON数据处理

    背景   这一篇可以说是“Hive JSON数据处理的一点探索”的兄弟篇.   平台为了加速即席查询的分析效率,在我们的Hadoop集群上安装部署了Spark Server,并且与我们的Hive数据仓 ...

  6. 逐行返回http响应的内容

    前言 问题:1.什么是特殊字符? 2.为什么要处理特殊字符? 答:特殊字符指相对于传统或常用的符号外,使用频率较少字符且难以直接输入的符号,比如数学符号:单位符号:制表符等 有些符号在URL中是不能直 ...

  7. OGRE插件设计-Texture与GLTexture

    背景: 学习OGRE,在OGRE中 Core是最小的精简逻辑集合,而真正的功能则需要插件来实现,但是作为插件应该与Core保持最小的连接,同时Core不会调用插件的接口,而动态链接库又不能直接把类连接 ...

  8. python进度1

    Python 错误和异常 异常参数: 3.4与2.7有些不同 3.4中 try: x except NameError as e: print(type(e)) print(e) 运行结果: < ...

  9. DAL与数据库类型的对应关系

    MSSQL Server类型 DbType类型 C#类型   MySql类型 DbType类型 C#类型 bit Boolean bool   bit(1) Boolean bool tinyint ...

  10. How to effectively work with multiple files in Vim?

    Why not use tabs (introduced in Vim 7)? You can switch between tabs with :tabn and :tabp, With :tabe ...