如何将 a 转换std::wstring
为 a TCHAR*
?std::wstring.c_str()
不起作用,因为它返回一个wchar_t*
.
我如何从wchar_t*
toTCHAR*
或从std::wstring
to 到达TCHAR*
?
用这个 :
wstring str1(L"Hello world");
TCHAR * v1 = (wchar_t *)str1.c_str();
#include <atlconv.h>
TCHAR *dst = W2T(src.c_str());
将在 ANSI 或 Unicode 构建中做正确的事情。
如果定义了 UNICODE,则 TCHAR* 定义为 wchar_t*,否则为 char*。所以你的代码可能看起来像这样:
wchar_t* src;
TCHAR* result;
#ifdef UNICODE
result = src;
#else
//I think W2A is defined in atlbase.h, and it returns a stack-allocated var.
//If that's not OK, look at the documenation for wcstombs.
result = W2A(src);
#endif
通常这是不可能的,因为 wchar_t 的大小可能与 TCHAR 不同。
已经列出了几种用于在字符集之间进行转换的解决方案。如果字符集在要转换的范围内重叠,这些可以工作。
我更愿意尽可能完全回避这个问题,并使用在 TCHAR 字符集上定义的标准字符串,如下所示:
typedef std::basic_string<TCHAR> tstring;
使用这个你现在有一个标准库兼容的字符串,它也与 windows TCHAR 宏兼容。
您可以使用:
wstring ws = L"Testing123";
string s(ws.begin(), ws.end());
// s.c_str() is what you're after
假设您在 Windows 上运行。
如果您在 Unicode 构建配置中,那么TCHAR
和wchar_t
是一回事。您可能需要强制转换,具体取决于您是否将 /Z 设置为wchar_t
是类型,而 wchar_t 是类型定义。
如果您处于多字节构建配置中,则需要MultiByteToWideChar
(反之亦然)。