std :: wstring.c_str()返回wchar_t *。如何將std :: wstring轉換爲TCHAR *
如何從wchar_t的*得到TCHAR *,或從的std :: wstring的,以TCHAR *
感謝
std :: wstring.c_str()返回wchar_t *。如何將std :: wstring轉換爲TCHAR *
如何從wchar_t的*得到TCHAR *,或從的std :: wstring的,以TCHAR *
感謝
#include <atlconv.h>
TCHAR *dst = W2T(src.c_str());
會做正確的事ANSI或Unicode版本。
你需要'USES_CONVERSION;'在'W2T'前面,否則它會抱怨:「錯誤C2065:'_lpw':未聲明的標識符」等 – Deqing 2016-05-24 00:48:16
TCHAR *被定義爲wchar_t *如果UNICODE被定義,否則它的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
假設您正在Windows上運行。
如果您使用的是Unicode編譯配置,那麼TCHAR
和wchar_t
是相同的。您可能需要演員陣列,具體取決於您是否將wchar_t
設置爲/ Z,而wchar_t是typedef。
如果您處於多字節構建配置中,則需要MultiByteToWideChar
(並且反之亦然)。
您可以使用:
wstring ws = L"Testing123";
string s(ws.begin(), ws.end());
// s.c_str() is what you're after
in general這是不可能的,因爲wchar_t可能與TCHAR的大小不一樣。
已經列出了幾種用於字符集之間轉換的解決方案。如果字符集與要轉換的範圍重疊,這些可以工作。
我喜歡儘可能完全迴避這個問題,並使用已在TCHAR字符集定義的標準字符串,如下所示:使用此
typedef std::basic_string<TCHAR> tstring;
你現在有一個標準庫兼容的字符串,它是也與Windows TCHAR宏兼容。
使用本:
wstring str1(L"Hello world");
TCHAR * v1 = (wchar_t *)str1.c_str();
錯誤C2440:'初始化':無法從'wchar_t *'轉換爲'TCHAR *' – Deqing 2016-05-24 00:44:52
完美地工作。謝謝。 – 2016-08-30 17:39:28
請記住,這是可能的,只有wstring的只包含ANSI字符。不要期望建議的解決方案的結果在任何時候都是正確的字符串。事實上,如果你必須這樣做,這可能意味着有什麼問題。 在這裏看到我的答案: http://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful/1855375#1855375 關於我如何相信這種情況應該處理,通過避免TCHAR完全。 – 2009-12-13 06:25:07