将 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_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;
}
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 结果都不正确)。你可能需要的是在任何地方使用宽字符串 .
我正在通过控制台读取用户的文件目录,我必须将值存储在 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_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;
}
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 结果都不正确)。你可能需要的是在任何地方使用宽字符串 .