(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()函数说明
- 功能:MultiByteToWideChar是一种windows API 函数,用于将多字节字符串转换为宽字符串(通常是 Unicode)
- 原型:
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时不使用缓冲区,而是函数返回缓存区长度
);
- 参数
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