/*
#ifdef WIDECHAR//#ifdef /#ifndef 具有在本文件内向上溯源性 在上面的可以识别 在下面的不能识别
#endif
wchar_t *pszText=L"HelloT_char";
wprintf(L"%s\n",pszText);
#else
char *pszText="HelloT_char";
printf("单%s\n",pszText);
#endif
*/
对于wchar_t 类型的字符串 要进行c语言字符串相应的操作 都要加上w
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.ANSIC与Unicode字符
两者区别就不多少了,一个单字节一个双字节,Unicode可以表示更多的字符,适合诸如汉字的文字系统.
定义使用宽字符:
2.声明Unicode字符与及字符串方法:
_T()宏需要包含tchar.h
1 wchar_t c=L'A'; 2 wchar_t szBuffer[10]=L"A String";3
WinNt.h定义了一下宏:
#ifdef UNICODE typedef WCHAR TCHAR ,*PTCHAR,PTSTR; typedef CONST WCHAR *PCTSTR; __TEXT(quote) quote __TEXT(quote) L##quote typedef CHAR TCHAR ,*PTCHAR,PTSTR; typedef CONST CHAR *PCTSTR; __TEXT(quote) quote __TEXT(quote) quote TEXT(quote)
可以利用以上宏来定义:在Visual Studio新建工程,一般都开启了Unicode选项,直接就可以定义宽字符。
1 TCHAR C=TXET('a');//如果定义了Unicode 则是16位字符,否则是8位2 TCHAR C=L'a';3 TCHAR szBuffer[10]=TEXT("a String");4 TCHAR szBuffer[10]=_T("a String");5
3.Ansic与Unicode的转换:
*c =; std::cout<<c<<std::endl; Length = MultiByteToWideChar(CP_ACP,,c,-,NULL,); wchar_t *pWideCharStr = wchar_t[(wchar_t)*Length]; MultiByteToWideChar(CP_ACP,,c,,pWideCharStr,Length*(wchar_t)); std::wcout<<<<pWideCharStr<<std::endl; Length = WideCharToMultiByte(CP_ACP,,pWideCharStr,-,NULL,,NULL,NULL); *pMultiByte = [Length*()] ; WideCharToMultiByte(CP_ACP,,pWideCharStr,-,pMultiByte,Length*(),NULL,NULL); std::cout<<<<pMultiByte; delete [] pWideCharStr; delete [] pMultiByte;
补充:
size_t wcstombs ( char * mbstr, const wchar_t * wcstr, size_t max );//Convert wide-character string to multibyte string
size_t mbstowcs ( wchar_t * wcstr, const char * mbstr, size_t max );//Convert multibyte string to wide-character string
这两个看就清楚怎么用了就不写了 比上面方法要简单
4.推荐的字符串使用方式
1).开始将文本字符串想像为字符的数组,而不是char或字节的数组
2).用通用的数据类型如用TCHAR PTSTR表示字符和字符串
3).统一用TEXT _T宏来表示字面量的字符和字符串,不要混用
4).用BYTE和 PBYTE来表示字节、字节指针和数据缓冲区
5).避免使用printf系列函数,尤其不要使用%s来进行Ansic跟Unicode的互相转换
应该使用MultiByteToWideChar和WideCharToMutiByte,具体用法参看MSDN
6).推荐从现在开始就使用Unicode字符,理由很简单,为了程序代码的重用性:Com编程模型只支持Unicode
微软.Net技术,还有新的API函数都不支持ANSIC
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
char跟CString转换、string跟char转换、string 跟CString转换 还有BSTR转换成char*、char*转换成BSTR、CString转换成BSTR、BSTR转换成CString的
我们经常写程序比如文件路径需要用到一般都是char*类型的变量作为参数传递,有些函数参数却是string或者CString,造成了经常需要转换,在这里我总结了一下:
char跟CString转换:
代码
CString cstr(_T()); wchar_t* wchar = cstr.GetBuffer(); * c1 = [cstr.GetLength()+]; cstr.ReleaseBuffer(); wcstombs(c1,wchar,cstr.GetLength()+); std::cout<<c1<<std::endl; delete c1; CString theString( ); LPTSTR lpsz = TCHAR[theString.GetLength()+]; _tcscpy(lpsz, theString); * c2 = [theString.GetLength()+]; wcstombs(c2,lpsz,theString.GetLength()+); std::cout<<c2<<std::endl; delete c2; * p2 = ; wchar_t *p1 = wchar_t[]; mbstowcs(p1,p2,); std::wcout<<p1<<std::endl; CString cstr1; cstr1.Format(_T(),p1); ::MessageBox(NULL,cstr1,NULL,); delete p1;
注意:
CString 是微软提供的数据类型,其中GetBuffer()函数是重载了ANSIC跟UNICODE的,假如编译器设置开启了Unicode
那它返回的就是宽字符类型,所以就需要wcstombs函数来转换。比如VC6下默认不支持Unicode,所以用它返回就不需要转换
string跟char转换:
代码
s1(); * c3 = [s1.size()+]; strcpy(c3,s1.c_str()); std::cout<<c3<<std::endl; delete c3; * c4 = ; s2(c4); std::cout<<s2<<std::endl;
注意:
string是标准库的数据类型,其成员函数c_str()返回的是ANSIC数据类型,所以不需要转换直接就为char,假如需要宽字符,再用mbstowcs就可以了
string 跟CString转换:
代码
CString cstr2; s3 = ; * c5 = [s3.size()+]; wchar_t* c6 = wchar_t[s3.size()+]; strcpy(c5,s3.c_str()); mbstowcs(c6,c5,s3.size()+); cstr2.Format(_T(),c6); ::MessageBox(NULL,cstr2,NULL,); delete c5; delete c6; CString cs1(); * c7 = [cs1.GetLength()+]; wcstombs(c7,cs1.GetBuffer(),cs1.GetLength()+); s(c7); std::cout<<s<<std::endl; delete c7;
注意:
由上面两个就可以清楚知道:CString会根据环境重载ANSIC还是UNICODE版本的,而string只能是ANSIC版本的
而string跟CString转换原理是通过都转换为传统的char类型,然后再转换到对方,因此这里有需要进行ANSIC跟UICODE的转换
比如string接受传统的string s(char* ); 但CString.GetBuffer()返回有可能是wchar_t*类型的
BSTR转换成char*、char*转换成BSTR、CString转换成BSTR、BSTR转换成CString
(BSTR是COM里面经常会用到的数据类型,可能大家用得较少,我也没逐一进行认真分析了)
BSTR与char*转换:
代码
#include comment(lib, "comsupp.lib") _tmain( argc, _TCHAR* argv[]) { BSTR bstrText = ::SysAllocString(L); * lpszText2 = _com_util::ConvertBSTRToString(bstrText); SysFreeString(bstrText); delete[] lpszText2; ; } _bstr_t b = bstrText; * lpszText2 = b; BSTR bstrText = ::SysAllocString(L); BSTR bstrText = ::SysAllocStringLen(L,); BSTR bstrText = ::SysAllocStringByteLen(,); _variant_t strVar(); BSTR bstrText = strVar.bstrVal; BSTR bstrText = _bstr_t(); 方法四,使用CComBSTR。例如: BSTR bstrText = CComBSTR(); CComBSTR bstr(); BSTR bstrText = bstr.m_str; 方法五,使用ConvertStringToBSTR。 例如: * lpszText = ; BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
CString与BSTR转换:
代码
CString str(); BSTR bstrText = str.AllocSysString(); … SysFreeString(bstrText); BSTR bstrText = ::SysAllocString(L); CStringA str; str.Empty(); str = bstrText; 或 CStringA str(bstrText);
本文出自 “日知其所无” 博客,谢绝转载!