c_str()和data()区别是:前者返回带'/0'的字符串,后者则返回不带'/0'的字符串.好像在c++11两者没有区别了
std::string、std::wstring的关系
①:std::string内部是char单字节字符
②:std::wstring内部是WCHAR宽字符,即wchar_t
在MFC的工程中我们可以设置工程的编码属性:
①:对于UNICODE的编码属性CString被定义为CStringW,其内部是WCHAR宽字符 即wchar_t
②:对于多字节的编码属性CString被定义为CStringA,其内部是char单字节字符
字符串的ASCII和UNICODE之间的转换
1)Win32提供了API函数MultiByteToWideChar和WideCharToMultiByte来提供这种功能。
2)ATL还提供了另一套转换宏——CA2W、CA2T、CA2WEX、CA2CT、CW2T、CW2A、CW2AWX
CW2A将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W就是将多字符集(ASCII)转化为宽字符集(Unicode)
所以,自己推测的,在mfc的UNICODE的编码
1.string.c_str() 得到char*
2.wstring.c_str() 得到wchar*
char []转char *:直接进行赋值即可
char str[] = "lala";
char *str1 = str;
char *转char[]:字符拷贝实现,不能进行赋值操作
char *st = "hehe";
char st1[] = "lalalala";
strncpy(st1, st, strlen(st) + 1); // 注意加1操作
string 转 char* :c_str() 使用str.c_str()返回的是const char* 类型,如果想转换为char* 类型需经过const_cast<char*>()
string str11 = "hello";
const char *p1 = str11.c_str(); //注意必须加上const,不然编译不过
或者char *st1 = const_cast<char *>(str11.c_str());
char *转string:
1)直接赋值;
const char *st = "hello";
string st1 = st;
//注意,定义char *变量,并直接赋值,最好定义为const变量,否则编译器警告
2)构造转换实现
const char *st = "hello";
string s1(st, st + strlen(st));
char []转string:
1)直接赋值;
char st[] = "hello";
string st1 = st;
2)构造转换实现
string st2(st, st + strlen(st));
string转char[]:拷贝实现,不能直接赋值。即string不能直接转换为char[],可以先转换为char*,再通过strcpy来转换
string ts = "My test1";
char ts1[] = "lalallalalaaaa";
strncpy_s(ts1, ts.c_str(), ts.length() + 1); // 注意,一定要加1,否则没有赋值'\0'
同理:wchar_t* 、wchar_t[] 、wstring 互转参考上面的
wstring 转wchar_t* c_str() 使用str.c_str()返回的是const wchar_t* 类型,如果想转换为wchar_t* 类型需经过const_cast<wchar_t*>()
std::wstring test5 = L"中文";
const wchar_t* test8 = test5.c_str();
wchar_t* test9 = const_cast<wchar_t*> (test5.c_str());
wchar_t *转 char * 和 char * 转 wchar_t*
方法一:利用Windows的宏W2A,A2W
USES_CONVERSION;
char* test1 = W2A(L"我是宽字节");//转化成默认
wchar_t* test12 = A2W("我是窄字节");
方法二:利用Windows里的ATL里面的类CW2A和CA2W
CW2A将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W就是将多字符集(ASCII)转化为宽字符集(Unicode)
std::string test3 = CW2A(L"中文字符", CP_UTF8);//一般可以加一下第二个参数,顺便切换编码
std::wstring test4 = CA2W("中文字符");//一般不用加第二个参数
方法三:利用Windows API中的函数 WideCharToMultiByte 和 MultiByteToWideChar
wchar_t * char2wchar(const char* cchar, size_t m_encode = CP_ACP)
{
wchar_t *m_wchar;
int len = MultiByteToWideChar( m_encode ,0,cchar ,strlen( cchar), NULL,0);
m_wchar= new wchar_t[len+1];
MultiByteToWideChar( m_encode ,0,cchar,strlen( cchar),m_wchar,len);
m_wchar[len]= '\0' ;
return m_wchar;
}
char * wchar2char(const wchar_t* wchar ,size_t m_encode = CP_ACP)
{
char * m_char;
int len= WideCharToMultiByte( m_encode ,0,wchar ,wcslen( wchar ), NULL,0, NULL ,NULL );
m_char= new char[len+1];
WideCharToMultiByte( m_encode ,0,wp ,wcslen( wchar ),m_char,len, NULL ,NULL );
m_char[len]= '\0';
return m_char;
}
所以string 和wstring 互转 参考 wchar_t *互转 char *
std::wstring test16 = L"中文字符";
std::string test17 = CW2A(test16.c_str());
wstring 转 cstring c_str()
std::wstring test5 = L"中文";
CString strtest5 = test5.c_str();
cstring 转 wstring
方法一:GetString() 只读
CString strtest5 = _T("中文");
std::wstring test6 = strtest5.GetString();
方法二:GetBuffer() 读写 需要ReleaseBuffer()配合一起
CString strtest5 = _T("中文");
std::wstring test7 = strtest5.GetBuffer();
strtest5.ReleaseBuffer();
cstring 转 wchar_t* GetBuffer 和ReleaseBuffer
CString strtest5 = _T("中文");
const wchar_t* test10 = strtest5.GetBuffer();
strtest5.ReleaseBuffer();
cstring 转 wchar_t[] 字符拷贝实现,不能进行赋值操作
CString strtest5 = _T("中文");
wchar_t test11[8] = {0};
wcscpy_s(test11, strtest5.GetBuffer());
strtest5.ReleaseBuffer();
wchar_t[] 转 cstring 直接赋值;
wchar_t test13[8] = L"中文";
CString strtest12 = test13;
wchar_* 转 cstring 直接赋值;
wchar_t* test14 = L"中文";
CString strtest15 = test14;
char*、char*[]、string 转cstring 分ASCII和UNICODE两种编码格式
1.ASCII或者说是多字节 直接赋值或者是format
string -> CString :
std::string test18 = "hell0";
CString strtest19;
strtest19.Format(_T("%s"), test18.c_str());
CString strtest20;
strtest20 = test18.c_str();
2.UNICODE或者说是宽字节 参考 char * 转 wchar_t* 不能直接赋值,同时考虑中文乱码问题。
如有中文,最好使用 MultiByteToWideChar
cstring 转char*、char*[]、string 分ASCII和UNICODE两种编码格式
1.ASCII或者说是多字节
CString -> string :
办法一:GetBuffer //GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
CString str11 = "123";
char *t1 = str11.GetBuffer();
str11.ReleaseBuffer();
办法二:(LPSTR)(LPCSTR)
CString str1 = "123";
char *p = (LPSTR)(LPCSTR)str1;
2.UNICODE或者说是宽字节 参考 wchar_t* 转 char * 不能直接赋值,同时考虑中文乱码问题。