std::wstringstd::string,charwchar_t

时间:2021-05-09 20:18:49
#include<iostream>
#include<codecvt>
#include<string>

using namespace std;
//vs中将string->wstring
//问题:对中文不支持
wstring utf8_to_wstring(const std::string& str){
    wstring_convert<codecvt_utf8<wchar_t>> mconv;
    return mconv.from_bytes(str);
}
//vs中将wstring->string
//问题:对中文不支持
string wstring_to_utf8(const wstring& wstr){
    wstring_convert<codecvt_utf8<wchar_t>> mconv;
    return mconv.to_bytes(wstr);
}
int main(){
    wstring wstr= utf8_to_wstring(string("jiafenggang"));
    wcout << wstr << endl;

    wstring wstr1 = L"jiafenggang";
    string str = wstring_to_utf8(wstr1);
    cout << str << endl;
    return 0;
}

如果要对中文支持还是需要WideCharToMultiByte和MultiByteToWideChar

#pragma once
#include<Windows.h>
#include<string>

class UTIL
{
public:
	//功能:将char数组 转换为wchar_t数组
	//*ansi->char数组
	//返回:生成的wchar_t数组
	//注意:用户负责释放返回数组内存
	//约定:不会改变用户传入的参数,但用户可以改变返回值
	static PWSTR ansi2unic(PCSTR ansi);
	//功能:将wchar_t数组 转换为char数组
	//*unic->wchar_t数组
	//返回:生成的char数组
	//注意:用户负责释放返回数组内存
	//约定:不会改变用户传入的参数,但用户可以改变返回值
	static PSTR	unic2ansi(PCWSTR unic);
	//功能:将wchar_t数组 转换为string
	//*unic->wchar_t数组
	//返回:生成的string
	//约定:不会改变用户传入的参数,但用户可以改变返回值
	static std::string unic2str(const wchar_t* unic);
	//功能:将string 转换为wchar_t数组
	//*str->要转换的string
	//返回:生成的wchar_t数组
	//注意:用户负责释放返回数组内存
	//约定:不会改变用户传入的参数,但用户可以改变返回值
	static wchar_t* str2unic(const std::string& str);
private:

};

  


#include"util.h"

PWSTR UTIL::ansi2unic(PCSTR ansiStr){
    PWSTR unicStr=NULL;
    DWORD len = MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, unicStr, 0);
    unicStr = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, unicStr, len);
    return unicStr;
}

PSTR UTIL::unic2ansi(PCWSTR unicStr){
    PSTR ansiStr=NULL;
    DWORD len = WideCharToMultiByte(CP_ACP, 0, unicStr, -1, ansiStr, 0,NULL,NULL);
    ansiStr = new char[len];
    WideCharToMultiByte(CP_ACP, 0, unicStr, -1, ansiStr, len, NULL, NULL);
    return ansiStr;
}

std::string UTIL::unic2str(const wchar_t* unicStr){
    const char* p = unic2ansi(unicStr);
    std::string str(p);
    delete p;
    return str;
}

wchar_t* UTIL::str2unic(const std::string& str){
    return ansi2unic(str.c_str());
}