如何从LPCTSTR转换为std :: string?

Gra*_*amS 9 c++ string visual-c++

我有一个LPCTSTR想要调用带std::string参数的函数.

我需要做什么转换?

Jon*_*Jon 16

冰山一角

LPCTSTR可以是单字节字符串也可以是多字节字符串(取决于UNICODE编译期间定义的常量或不是),而std::string用户(包括您的函数)通常使用它来保存单字节字符串.

您需要两次转换:一次用于LPCSTR(非UNICODE构建),一次用于LPCWSTR(UNICODE构建).第一个很简单:

std::string convert(LPCSTR str) {
    return std::string(str);
}
Run Code Online (Sandbox Code Playgroud)

第二个需要将其输入参数首先转换为另一个编码WideCharToMultiByte.不要被名称吓到,结果可以是单字节字符串; 这取决于CodePage参数.您必须使用代码页进行单字节编码,例如CP_ACP.

更新:WideCharToMultiByte示例

请注意,如果输入字符串包含目标编码的代码页中不存在的字符,则在技术上不可能准确地转换为单字节编码.由于您提到它将用于文件系统功能,如果文件路径包含此类字符,则转换将不会100%准确,并且后续函数调用将失败.

std::string MBFromW(LPCWSTR pwsz, UINT cp) {
    int cch = WideCharToMultiByte(cp, 0, pwsz, -1, 0, 0, NULL, NULL);

    char* psz = new char[cch];

    WideCharToMultiByte(cp, 0, pwsz, -1, psz, cch, NULL, NULL);

    std::string st(psz);
    delete[] psz;

   return st;
}
Run Code Online (Sandbox Code Playgroud)

警告:上面的例子来自我所说的一些代码,并不是生产级质量.一个明显的缺陷是它不是例外安全的.它也可能杀死所有漂亮的紫色独角兽.仅用它作为例子.

完整的编码地狱

赤裸裸的事实是,std::string可用于多字节编码(如UTF-8)就好了-你甚至可以用它来保存宽字符的字符串,因为它是字节的心脏只是一个二进制安全数组.

问题是STL函数适用于std::string期望其内容采用单字节编码,如果不是这样,它们将不会产生正确的结果.

通过扩展,我们不知道std::string参数所需的函数是什么 - 它可能期望以UTF-8编码的字符串.但是"按惯例",我假设它也想要一个单字节编码的字符串.


Inv*_*rse 10

在一行:

std::string s = CT2A( lpctstr );
Run Code Online (Sandbox Code Playgroud)