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

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

文章目录

  • [C++] char* 与 wchar_t* 的转换
    • 多字节与宽字节
    • 转换
      • 方法一(Windows)
      • 方法二(标准库)
        • 中的`mbstowcs` `wcstombs`
        • 中的`mbstowcs_s` `wcstombs_s`

多字节与宽字节

  • 多字节字符集(Muilti-Bytes Charecter Set):就是我们常说的ANSI编码
  • 宽字节字符集(Wide-Byte Character Set):一般指Unicode
多字节字符类型 宽字节字符类型
char wchar_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<
MessageBoxW(NULL,text,L"Caption",MB_OK);

[C++] char* 与 wchar_t* 的转换_第1张图片
成功

方法二(标准库)

中的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

中的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。

你可能感兴趣的:(C++,Win32,c++,开发语言)