如何在 C++ 中将 LPCTSTR 转换为 std::string
How to convert LPCTSTR to std::string in C++
我有一个将参数作为 LPCTSTR 的函数
我想将该函数中的参数与 std::string
连接起来
根据我在转换后使用的建议之一:
std::string PlaybackStart(LPCTSTR i_bstrCameraName)
{
wstring cid = (WCHAR*)i_bstrCameraName;
string fcid;
for (char x : cid)
fcid += x;
std::string myURL = "SOME IP";
**//I want to concatenate myURL with i_bstrCameraName here**
return myURL;
}
但这会导致数据丢失,例如参数中传递的值是“abcdefg”,但我的 fcid 得到的值是“aceg”。
LPCTSTR
是 const TCHAR*
的别名,其中 TCHAR
是 char
或 wchar_t
,具体取决于项目配置。
如果您的项目配置为将 TCHAR
映射到 char
,则从 i_bstrCameraName
到 WCHAR*
的转换是错误的。只需使用 char
数据 as-is 即可。
如果 TCHAR
配置为映射到 wchar_t
,则 for
循环中 wchar_t
字符到 char
的转换是错误的。这将丢失 non-ASCII 个字符的数据。您需要使用 WideCharToMultiByte()
或等效于 将 wchar_t
数据正确转换为 char
。
你真的不应该在现代代码中使用基于 TCHAR
的功能。自从微软将用户从 ANSI-based Win9x/ME 迁移到 Unicode-based WinNT+ 以来,就不需要了。
但是,如果必须的话,您的代码应该看起来更像这样:
std::string PlaybackStart(LPCTSTR i_bstrCameraName)
{
string fcid;
#ifdef UNICODE
int wlen = lstrlenW(i_bstrCameraName);
int len = WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, NULL, 0, NULL, NULL);
fcid.resize(len);
WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, &fcid[0], len, NULL, NULL);
#else
fcid = i_bstrCameraName;
#endif
std::string myURL = "SOME IP";
myURL += fcid;
return myURL;
}
也就是说,参数名称 i_bstrCameraName
表明该参数实际上应该声明为 BSTR
,而不是 LPCTSTR
。 BSTR
是 OLECHAR*
又名 wchar_t*
的别名,例如:
std::string PlaybackStart(BSTR i_bstrCameraName)
{
string fcid;
int wlen = SysStringLen(i_bstrCameraName);
int len = WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, NULL, 0, NULL, NULL);
fcid.resize(len);
WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, &fcid[0], len, NULL, NULL);
std::string myURL = "SOME IP";
myURL += fcid;
return myURL;
}
我有一个将参数作为 LPCTSTR 的函数
我想将该函数中的参数与 std::string
连接起来根据我在转换后使用的建议之一:
std::string PlaybackStart(LPCTSTR i_bstrCameraName)
{
wstring cid = (WCHAR*)i_bstrCameraName;
string fcid;
for (char x : cid)
fcid += x;
std::string myURL = "SOME IP";
**//I want to concatenate myURL with i_bstrCameraName here**
return myURL;
}
但这会导致数据丢失,例如参数中传递的值是“abcdefg”,但我的 fcid 得到的值是“aceg”。
LPCTSTR
是 const TCHAR*
的别名,其中 TCHAR
是 char
或 wchar_t
,具体取决于项目配置。
如果您的项目配置为将 TCHAR
映射到 char
,则从 i_bstrCameraName
到 WCHAR*
的转换是错误的。只需使用 char
数据 as-is 即可。
如果 TCHAR
配置为映射到 wchar_t
,则 for
循环中 wchar_t
字符到 char
的转换是错误的。这将丢失 non-ASCII 个字符的数据。您需要使用 WideCharToMultiByte()
或等效于 将 wchar_t
数据正确转换为 char
。
你真的不应该在现代代码中使用基于 TCHAR
的功能。自从微软将用户从 ANSI-based Win9x/ME 迁移到 Unicode-based WinNT+ 以来,就不需要了。
但是,如果必须的话,您的代码应该看起来更像这样:
std::string PlaybackStart(LPCTSTR i_bstrCameraName)
{
string fcid;
#ifdef UNICODE
int wlen = lstrlenW(i_bstrCameraName);
int len = WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, NULL, 0, NULL, NULL);
fcid.resize(len);
WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, &fcid[0], len, NULL, NULL);
#else
fcid = i_bstrCameraName;
#endif
std::string myURL = "SOME IP";
myURL += fcid;
return myURL;
}
也就是说,参数名称 i_bstrCameraName
表明该参数实际上应该声明为 BSTR
,而不是 LPCTSTR
。 BSTR
是 OLECHAR*
又名 wchar_t*
的别名,例如:
std::string PlaybackStart(BSTR i_bstrCameraName)
{
string fcid;
int wlen = SysStringLen(i_bstrCameraName);
int len = WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, NULL, 0, NULL, NULL);
fcid.resize(len);
WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, &fcid[0], len, NULL, NULL);
std::string myURL = "SOME IP";
myURL += fcid;
return myURL;
}