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() 得到cstring
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 * ? 不能直接赋值,同时考虑中文乱码问题。
|