将std :: string转换为wchar_t的typedef *

时间:2017-07-26 17:19:30

标签: c++ typedef wchar-t

我正在通过控制台从用户的文件目录中读取,我必须将值存储在pxcCHAR*变量中,该变量是typedef的{​​{1}} wchar_t* }。

我发现通过执行以下操作,我可以执行从std::stringstd::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*typedef的{​​{1}},我认为只需执行此操作即可:

wchar_t*

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

我希望隐式转换能够正常工作,但事实并非如此。我怎样才能克服这个错误?

2 个答案:

答案 0 :(得分:2)

使用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;
}
  

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

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

  

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

这意味着pxcCHAR不是const wchar_t的typedef,但更可能是wchar_t本身的typedef。无论使用何种类型,都无法为非const指针指定const指针。如果您需要进行此类分配,则必须将const打字,例如const_cast

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

答案 1 :(得分:0)

阅读Converting Unicode and ANSI Strings。您应该使用MultiByteToWideChar

话虽如此,您不太可能需要这样做(并且很可能结果不正确的任何代码页 CP1252)。你可能需要的是在任何地方使用宽字符串

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