如何在 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”。

LPCTSTRconst TCHAR* 的别名,其中 TCHARcharwchar_t,具体取决于项目配置。

如果您的项目配置为将 TCHAR 映射到 char,则从 i_bstrCameraNameWCHAR* 的转换是错误的。只需使用 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,而不是 LPCTSTRBSTROLECHAR* 又名 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;
}