将 std::string 转换为 wchar_t* 的类型定义

Converting std::string to a typedef of wchar_t*

我正在通过控制台读取用户的文件目录,我必须将值存储在 pxcCHAR* 变量中,这是 SDK 的 typedef for wchar_t*

我发现我可以通过执行以下操作将 std::string 转换为 std::wstring

#include <iostream>

int main(){
    std::string stringPath;
    std::getline(std::cin, stringPath);
    std::wstring wstrPath = std::wstring(stringPath.begin(), stringPath.end());
    const wchar_t* wcharPath = wstrPath.c_str();
    return 0;
}

当我运行这段代码时,我通过调试看到了这些值。

stringPath= "C:/Users/"
wstrPath= L"C:/Users/"
wcharPath= 0x00b20038 L"C:/Users/"

连接到 wcharPath 前面的值从哪里来?

此外,

因为 pxcCHAR*wchar_t*typedef,我认为可以简单地这样做:

pxcCHAR* mFilePath = wcharPath;

但是,我收到一条消息说 "const wchar_t*" 不能用于初始化 "pxcCHAR*" 类型的实体。

我希望隐式转换能够工作,但它没有。我该如何克服这个错误?

使用std::wstring(stringPath.begin(), stringPath.end()) 是处理字符串转换的错误方法,除非你能保证你只处理 7 位 ASCII 数据(文件系统不是这种情况)。这种类型的转换根本不考虑字符编码。将 std::string 转换为 std::wstring 的正确方法是使用 std::wstring_convertMultiByteToWideChar() 或其他等效方法。如果你环顾四周,有很多这样的例子。

最好只使用 std::wstring 而不是 std::string,例如:

#include <iostream>
#include <string>

int main(){
    std::wstring stringPath;
    std::getline(std::wcin, stringPath);
    const wchar_t* wcharPath = stringPath.c_str();
    return 0;
}

Where is the value concatenated to the front of wcharPath coming from?

调试器。它只是向您显示指针指向的内存地址,然后是该地址处的实际字符数据。

I get a message saying that "const wchar_t*" cannot be used to initialize an entity of type "pxcCHAR*".

这意味着 pxcCHAR 不是 const wchar_t 的类型定义,而更可能是 wchar_t 本身的类型定义。无论使用何种类型,都不能将 const 指针分配给非 const 指针。如果您需要进行此类分配,则必须对 const 进行类型转换,例如 const_cast:

pxcCHAR* mFilePath = const_cast<wchar_t*>(wcharPath);

阅读Converting Unicode and ANSI Strings. You should use MultiByteToWideChar

也就是说,您不太可能需要这样做(并且很可能对于任何代码页 而不是 CP1252 结果都不正确)。你可能需要的是在任何地方使用宽字符串 .

哦,阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)