VS各种常见类型互转

转载:http://blog.csdn.net/flydream0/article/details/8543525

VS编译环境下字符集分为使用Unicode字符集(UCS)和使用多字节字符集(MBCS)

 

1.多字节字符模式

 

1.1 CString ->char *

 

CString str1 ="123";

char *t1 =str1.GetBuffer(str1.GetLength());

str1.ReleaseBuffer();

//do something with t1

 

1.2 char * -->CString

 

char *str ="aaaa";

CString str1(str);

 

1.3 CString -->int

 

CString str1 ="123";

int i =atoi(str1);

//do something with i

 

1.4 int -->CString

 

int i =100;

CString str;

str.Format("%d",i);

//...

 

2.Unicode编码模式

 

2.1 CString -->char *

 

 

2.2 char * -->CString

 

char *p ="test";

CString str(p);

//...

 

2.3 CString -->int

 

在这种情况下atoi不再适用,其实可以用swscanf,如下:

CString str2 =_T("100");

int i;

swscanf(str2,_T("%d"),&i);

 

2.4 int -->CString

 

int i =100;

CString str;

str.Format("%d",i);

//...

 

2.5 wstring ->string

 

string WideCharToMultiChar(wstring str)

{

string return_value;

//获取缓冲区的大小,并申请空间,缓冲区大小是按字节计算的

int len = WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), NULL, 0, NULLNULL);

char *buffer = new char[len + 1];

WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), bufferlenNULLNULL);

buffer[len] = '\0';

//删除缓冲区并返回值

return_value.append(buffer);

delete[]buffer;

return return_value;

}

 

2.6 string->wstring

 

wstring MultCharToWideChar(string str)

{

//获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的

int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);

TCHAR *buffer = new TCHAR[len + 1];

//多字节编码转换成宽字节编码

MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), bufferlen);

buffer[len] = '\0';//添加字符串结尾

//删除缓冲区并返回值

wstring return_value;

return_value.append(buffer);

delete[]buffer;

return return_value;

}

 

2.7 CString->string

 

CString str;

string mstring = WideCharToMultiChar(str.GetBuffer());

str.ReleaseBuffer();

 

2.8 CString->LPCWSTR

 

CString str=_T("TestStr"); 

USES_CONVERSION; 

LPCWSTR lpcwStr = A2CW((LPCSTR)str);

 

2.9 LPCWSTR->CString

 

LPCWSTR lpcwStr = L"TestWStr"; 

CString str(lpcwStr);

 

3.其它转换

 

3.1. stringconst char*

string s ="abc";

const char* c_s = s.c_str();

 

3.2 char* const char* string

 

const char* c_s ="abc";

string s(c_s);

 

char* c ="abc";

string s(c);

 

3.3 stringchar*

 

string s ="abc";

char* c;

constint len = s.length();

c =newchar[len+1];

strcpy(c,s.c_str());

 

3.4 CString->LPTSTR

 

CString strFileName;

LPTSTR lpStr = strFileName.GetBuffer();

strFileName.ReleaseBuffer();

 

GetBuffer返回的LPTSTR为非const,从而允许直接修改CString中的内容

 

4.数据类型

Windows定义的数据类型:

 

通用数据类型

Unicode类型

ANSI类型

说明

TCHAR

WCHAR (wchar_t)

CHAR (char)

字符

LPTSTR

LPWSTR

(wchar_t *) 

LPSTR(char *)

指向一个字符数组的指针

LPCTSTR

LPCWSTR

(const wchar_t *)

LPCSTR(const char *)

指向一个字符串常量的指针


在调用宏进行转换的函数开头,要加上一句代码

USES_CONVERSION;

相互转换方法:
LPWSTR->LPTSTR:   W2T();

LPTSTR->LPWSTR:   T2W();

 

LPCWSTR->LPCSTR: W2CT();

LPCSTR->LPCWSTR: T2CW();

 

ANSI->UNICODE:     A2W();

UNICODE->ANSI:     W2A();

 

 

A2CW表示(LPCSTR) -> (LPCWSTR)

 

注意:使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:

 

1、只适合于进行短字符串的转换; 

2、不要试图在一个次数比较多的循环体内进行转换; 

3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的; 

4、对情况 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值