我正在通过控制台从用户的文件目录中读取,我必须将值存储在pxcCHAR*
变量中,该变量是typedef
的{{1}} 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*
是typedef
的{{1}},我认为只需执行此操作即可:
wchar_t*
但是,我收到一条消息说&#34; const wchar_t *&#34;不能用于初始化类型&#34; pxcCHAR *&#34;的实体。
我希望隐式转换能够正常工作,但事实并非如此。我怎样才能克服这个错误?
答案 0 :(得分:2)
使用std::wstring(stringPath.begin(), stringPath.end())
是处理字符串转换的错误方法,除非您可以保证只处理7位ASCII数据(文件系统不是这种情况)。这种类型的转换根本不考虑字符编码。将std::string
转换为std::wstring
的正确方法是使用std::wstring_convert
,MultiByteToWideChar()
或其他等价物。如果你环顾四周,有很多例子。
最好只使用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)。你可能需要的是在任何地方使用宽字符串。