string类型转LPCWSTR,解决C++中unicode编码中文乱码问题

  1. 知识点

(1)LPCTSTR有两种值,使用UNICODE字符集,则LPCTSTR = LPCWSTR,否则LPCTSTR = LPCSTR。
(2)LPCSTR:是指向string类型的指针,如果string类型转LPCSTR ,则string.c_str();
(3)LPCWSTR:是指向wstring类型的指针,如果wstring类型转LPCSTR ,则wstring.c_str();
(4)如果string类型转LPCWSTR,需要调用MultiByteToWideChar()函数把string转为wstring;

wstring CDoipEcuDlg::s2ws(const std::string& origstr)
{
	int len=0;
	int slength = (int)origstr.length() + 1;
	len = MultiByteToWideChar(CP_ACP, 0, origstr.c_str(), slength, 0, 0);	//计算所需宽字符数组的长度
	wchar_t* buf = new wchar_t[len];	//保留转换结果的缓冲区
	
	MultiByteToWideChar(CP_ACP, 0, origstr.c_str(), slength, buf, len);		//string转wstring,结果存在buf中
	std::wstring ret(buf);	//将缓冲区的值以初始化的方式赋值给ret
	delete[] buf;
	return ret;
}

int main(){
	string str="你好";
	wstring wstr = s2ws(str);
	LPCWSTR lstr= wstr .c_str();	//LPCWSTR 是一个指针类型,所以要用c_str()
}

MultiByteToWideChar()函数说明

  1. 功能:MultiByteToWideChar是一种windows API 函数,用于将多字节字符串转换为宽字符串(通常是 Unicode)
  2. 原型
MultiByteToWideChar(
    _In_ UINT CodePage,		//指定执行转换的字符集
    _In_ DWORD dwFlags,		//一组位标记,指定转换的类型和行为
    _In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr,		//指向要转换的字符串的指针
    _In_ int cbMultiByte,	//字符串的长度,如果此值为 -1,则函数会使用 '\0' 作为字符串的终止符。
    _Out_writes_to_opt_(cchWideChar,return) LPWSTR lpWideCharStr,	//指向接收转换结果的宽字符缓冲区的指针
    _In_ int cchWideChar	//宽字符缓冲区的大小(以字符为单位),为0时不使用缓冲区,而是函数返回缓存区长度
    );
  1. 参数
    CodePage取值
    在这里插入图片描述
    dwFlags取值
    在这里插入图片描述
    函数的缺省动作是转换成预作字符的形式。如果不存在,函数将尝试转换成组合形式
    MB_PRECOMPOSED:使用预作字符。如果未指定此标志,则函数使用选择性的字符组合。这是默认行为。
    MB_COMPOSITE:使用组合字符组合,不与MB_PRECOMPOSED一起使用。
    MB_ERR_INVALID_CHARS:如果函数遇到无效字符,则会引发错误。
    MB_USEGLYPHCHARS:使用Glyph字符。

string转wstring

//宽字符串转标准字符串
 std::string ws2s(const std::wstring &origstr)
 {
     int len=0;
     int slength = (int)origstr.length() + 1;
     len = WideCharToMultiByte(CP_ACP, NULL, origstr.c_str(), slength, nullptr, 0, 0, 0);
     char* buf = new char[len];		//申请内存
     WideCharToMultiByte(CP_ACP, NULL, origstr.c_str(), slength, buf, len, 0, 0);
     std::string ret(buf);	//将缓冲区的值以初始化的方式赋值给ret
     delete[] buf;		//释放内存
     return ret;
 }

//使用:string转CString
string str = "HELLO WORLD";
CString cs_str = ws2s(str).c_str();

CString转string

//cstring转string
CString theCStr = L"Hello C++";
std::string STDStr(CW2A(theCStr.GetString()));

Cstring转十六进制数

//CString转十六进制
CString str = L“0x0000009c;
long hWriteAddress = wcstol(str, NULL, 16);

字符串中去掉空格

//字符串中去掉空格
 str.erase(std::remove_if(strCmdSelect.begin(), strCmdSelect.end(), isspace), strCmdSelect.end());

参考

https://blog.csdn.net/sinat_24206709/article/details/82857836
https://blog.csdn.net/wcc27857285/article/details/77149851

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值