[C++] char* 与 wchar_t* 的转换

2 篇文章 0 订阅

[C++] char* 与 wchar_t* 的转换

多字节与宽字节

  • 多字节字符集(Muilti-Bytes Charecter Set):就是我们常说的ANSI编码
  • 宽字节字符集(Wide-Byte Character Set):一般指Unicode
多字节字符类型宽字节字符类型
charwchar_t

转换

方法一(Windows)

使用WideCharToMultiByte MultiByteToWideChar

int wchar2char(char* &str,const wchar_t* wstr) 
{  
    int len= WideCharToMultiByte( CP_ACP ,0,wstr ,wcslen( wstr ), NULL,0, NULL ,NULL );    
    str= new char[len+1];     
    WideCharToMultiByte( CP_ACP ,0,wstr ,wcslen( wstr ),str,len, NULL ,NULL );     
    str[len]= '\0';     
    return len; 
}

int char2wchar(wchar_t* &wstr,const char* str) 
{     
    int len = MultiByteToWideChar(CP_UTF8,0,str,strlen(str), NULL,0);     
    wstr = new wchar_t[len+1];     
    MultiByteToWideChar( CP_UTF8 ,0,str,strlen(str),wstr,len);     
    wstr[len]= '\0'; 
    return len;
} 

使用:

wchar_t* text;
if(char2wchar(text,"鸡你太美") < 0){
	cout<<"Failed to convert.";
}
//wcout<<text;
MessageBoxW(NULL,text,L"Caption",MB_OK);

在这里插入图片描述
成功

方法二(标准库)

<stdlib.h>中的mbstowcs wcstombs
int char2wchar(wchar_t* &wStr,const char* str){
	//setlocale(LC_ALL,"zh_CN.UTF-8");
	size_t w_len = mbstowcs(NULL, str, 0) + 1;
	if (w_len == 0){
		wStr = NULL;
	    return -1;
	}
	wStr=(wchar_t*)malloc(w_len*sizeof(wchar_t));
	if (!wStr){
	    return -1;
	}
	mbstowcs(wStr, str, w_len);
	return w_len;
}
//wchar to char func is similar。

调用也和上面一样,别忘了free

<stdlib.h>中的mbstowcs_s wcstombs_s
char* wchar2char(const wchar_t* wStr){
	char *str;
	size_t len = wcslen(wStr) + 1;
	size_t converted = 0;
	str=(char*)malloc(len*sizeof(char));
	wcstombs_s(&converted, str, len, wStr, _TRUNCATE);
	char* res = str;
	free(str);
	return res;
}

PS:如果你文件是utf8的中文可能会有乱码,加上setlocale(LC_ALL,“zh_CN.UTF-8”);
Linux还有可能显示不出来,但我们一般都只在win上用WCHAR。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

orbitgw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值