最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

C++中char与wchart之间的转换

来源:动视网 责编:小OO 时间:2025-09-30 21:02:32
文档

C++中char与wchart之间的转换

关于C++中的char*与wchar_t*这两种类型的相互转换,网上说的大多很繁琐,可行性也不高。下面这个方法是在MSDN里面找到的,个人认为还比较不错:把char*转换为wchar_t*用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法:char*CStr="stringtoconvert";size_tlen=strlen(CStr)+1;size_tconverted=0;wchar_t*WStr;WStr=(wchar_t*)malloc(len*sizeof
推荐度:
导读关于C++中的char*与wchar_t*这两种类型的相互转换,网上说的大多很繁琐,可行性也不高。下面这个方法是在MSDN里面找到的,个人认为还比较不错:把char*转换为wchar_t*用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法:char*CStr="stringtoconvert";size_tlen=strlen(CStr)+1;size_tconverted=0;wchar_t*WStr;WStr=(wchar_t*)malloc(len*sizeof
关于C++中的char*与wchar_t*这两种类型的相互转换,网上说的大多很繁琐,可行性也不高。下面这个方法是在MSDN里面找到的,个人认为还比较不错:

把char*转换为wchar_t*

用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法:

char *CStr = "string to convert";

size_t len = strlen(CStr) + 1;

size_t converted = 0;

wchar_t *WStr;

WStr=(wchar_t*)malloc(len*sizeof(wchar_t));

mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE);

其结果是WStr中储存了CStr的wchar_t版本。

把wchar_t*转换为char*

和上面的方法类似,用stdlib.h中的wcstombs_s函数,例子:

wchar_t *WStr = L"string to convert";

size_t len = wcslen(WStr) + 1;

size_t converted = 0;

char *CStr;

CStr=(char*)malloc(len*sizeof(char));

wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE);

这时WStr中的内容将被转化为char版本储存在CStr中。

另外还可以通过流的方法来char*类型转换为wchar_t*类型,但这样的转换得到的结果将是const类型,而类似的方法不能将wchar_t*类型转换为char*类型。

把(const)char*转换为const wchar_t*

需要用到 sstream 头文件:

char *cstr="string to convert";

wstringstream wss;

wss<再调用wss.str().c_str(); 即可得到 const wchar_t* 类型的返回值。

虽然stringstream流不能将wchar_t*转换成char*,但可以用来进行数值类型和字符串之间的转换,例如:

double d=2734792.934f;

stringstream ss;

ss<调用ss.str()可得到string类型字符串 ”273479e+006”,又如:

string str("299792458");

stringstream ss;

long i=0;

ss<ss>>i;

此时i=299792458。

Unicode下CString(wchar_t)转换为 char*

平台VC2005,使用Unicode字符集。因为以前一直是用多字节字符集的,使用的str开头的函数都要转换 成_wcs,烦,最后,被CString类型无法转换为char*或char[]的错误搞得是火大了。

使用以前转换CString的方法或者网上别人的指导用法,都失效了

1.strcpy_s( pchar, sizeof(pchar), mCString.GetBuffer(mCString.GetLength()) );不行,mCString.GetBuffer()返回的是wchar_t数组,使用Unicode字符集时,wchar_t无法自动转换为char*.

2.strcpy_s(pchar, sizeof(pchar), (LPCSTR)_bstr_t(mCString));不行,"_bstr_t找不到识别符"

3.char *pch = (T2A)(LPSTR)(LPCTSTR)mCString; 也不行,"T2A是没声明的标识符",我补加上相应头文件AtlConv.h或AtlBase.h等的,也还是报错不改。

4.char *pch = (LPSTR)(LPCTSTR)mCString; 这样没有报错,但pch只能获得CString的第一个字符而已,第一个换成(char*),也只能获取第一个字符。郁闷。

5.CString.GetBuffer(CString.GetLength())不行。w_char*不能转为_char*。

正确方法:

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(),buffer,len);

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

    //删除缓冲区并返回值

    wstring return_value;

    return_value.append(buffer);

    delete []buffer;

    return return_value;

}

string WideCharToMultiChar(wstring str)

{

    string return_value;

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

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

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

    WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),buffer,len,NULL,NULL);

    buffer[len]='\\0';

    //删除缓冲区并返回值

    return_value.append(buffer);

    delete []buffer;

    return return_value;

}

于是使用

string mstring = WideCharToMultiChar( (LPCTSTR)mCString );

strcpy_s( pach, sizeof(pach), mstring.c_str() );

转换成功 

文档

C++中char与wchart之间的转换

关于C++中的char*与wchar_t*这两种类型的相互转换,网上说的大多很繁琐,可行性也不高。下面这个方法是在MSDN里面找到的,个人认为还比较不错:把char*转换为wchar_t*用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法:char*CStr="stringtoconvert";size_tlen=strlen(CStr)+1;size_tconverted=0;wchar_t*WStr;WStr=(wchar_t*)malloc(len*sizeof
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top