UNICODE下宽字符的CString转换为const char *和char到WCHAR的相互转换

一、

使用函数_tcscpy_s:

CString theString( "This is a test" );
int    sizeOfString = (theString.GetLength() + 1);
LPTSTR  lpsz = new TCHAR[ sizeOfString ];
_tcscpy_s(lpsz, sizeOfString, theString);

最后再转换一下lpsz为const型的

LPTSTR在UNICODE环境下编译是wchar_t类型

 

二、

CString str = _T("Hello World!");

char szStr[256] = {0};

wcstombs(szStr, str, str.GetLength());//Unicode转换为ASCII

const char * p = szStr;

 三、

size_t mbstowcs(    wchar_t* wcstr,    const char* mbstr,    size_t count );ASCII转换为Unicode

参数解释如下:

wcstr
The address of a sequence of wide characters.
mbstr
The address of a sequence of multibyte characters.
count
The number of multibyte characters to convert.

四、

CString IMSI=_T("888888888888888"); 

 char *pBuffer1 = NULL;
  pBuffer1 = new char[IMSI.GetLength()+1];
  ZeroMemory(pBuffer1, IMSI.GetLength()+1);
  USES_CONVERSION;
  pBuffer1=(char*)W2A((LPCTSTR)IMSI);
  使用pBuffer1后,delete[] pBuffer1;但是我调试的时候报错,显示内存崩溃,后来我不用new了,直接初始化一个char数组,示例如下:

  char pBuffer1[16]={0};

  USES_CONVERSION;
  strcpy(pBuffer1,(char*)(W2A((LPCTSTR)registerPak.IMSI)));

这样也不用delete了,不会出现内存问题,如果哪位知道内存崩溃的原因给我留言啊!!

 

CString是个好东西,有很多好用的成员函数,并且动态分配内存空间。但在MFC学习初期,容易把CString与const char*,char*混淆。遇到三种类型数据转换时,总是得过且过。下面就剖析一下三者之间的转换关系与方法。
 
1、CString与const char*(LPCTSTR---是在Unicode环境下const char*的宏定义)
 
CString类提供一个const char*()把CString类型转换为LPCTSTR类型。
比如AfxMessageBox()的使用,可以采用:
char szMessageText[] = "Unknown error";
AfxMessageBox(szMessageText);
也可以这样:
CString strMessageText("Unknown ;error");
AfxMessageBox(strMessageText);
 
CString类也提供了一个构造函式把LPCTSTR类型转换为CString类型。比如:
CString strTruth;
strTruth += " is alive";
 
2、CString与char*
调用CString::GetBuffer在Buffer中开辟一定大小的空间并返回一个char*。注意要在使用完char*后要调用CString::ReleaseBuffer以此保证CString的动态性。例如:
CString strTest("test");
strncpy(strTest.GetBuffer(5), "T", 1);
strTest.ReleaseBuffer();
ASSERT(strTest == "Test");编写以字符串为参数的函数所遵循的规则:a、如果函数不改写字符串的内容并且要调用C Runtime的函数,那么函数要用const char*类型参数;b、如果函数不改写字符串的内容并且要调用CString的成员函数,那么函数要用const CString&类型参数;c、如果函数要改写字符串的内容,那么函数要用CString&类型参数。

 

如果想把const char* 赋给char*,可以使用strcpy()函数;

也可以参考MSDN:CString Operations Relating to C-Style Strings。ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vclib/html/5048de8a-5298-4891-b8a0-c554b5a3ac1b.htm

 

另一种相互转换char和WCHAR的方法(也就是从ASCII的字符到Unicode的字符的相互转换):

1,从char到WCHAR的转换:

int MultiByteToWideChar(

  UINT CodePage,

  DWORD dwFlags,

  LPCSTR lpMultiByteStr,

  int cbMultiByte,

  LPWSTR lpWideCharStr,

  int cchWideChar

);

2,从WCHAR到char的转换:

int WideCharToMultiByte(

  UINT CodePage,

  DWORD dwFlags,

  LPCWSTR lpWideCharStr,

  int cchWideChar,

  LPSTR lpMultiByteStr,

  int cbMultiByte,

  LPCSTR lpDefaultChar,

  LPBOOL lpUsedDefaultChar

);

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tridrop/archive/2008/04/19/2307876.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值