2009-12-03 254 views
2

std :: wstring.c_str()返回wchar_t *。如何將std :: wstring轉換爲TCHAR *

如何從wchar_t的*得到TCHAR *,或從的std :: wstring的,以TCHAR *

感謝

+0

請記住,這是可能的,只有wstring的只包含ANSI字符。不要期望建議的解決方案的結果在任何時候都是正確的字符串。事實上,如果你必須這樣做,這可能意味着有什麼問題。 在這裏看到我的答案: http://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful/1855375#1855375 關於我如何相信這種情況應該處理,通過避免TCHAR完全。 – 2009-12-13 06:25:07

回答

4
#include <atlconv.h> 

TCHAR *dst = W2T(src.c_str()); 

會做正確的事ANSI或Unicode版本。

+1

你需要'USES_CONVERSION;'在'W2T'前面,否則它會抱怨:「錯誤C2065:'_lpw':未聲明的標識符」等 – Deqing 2016-05-24 00:48:16

2

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 
0

假設您正在Windows上運行。

如果您使用的是Unicode編譯配置,那麼TCHARwchar_t是相同的。您可能需要演員陣列,具體取決於您是否將wchar_t設置爲/ Z,而wchar_t是typedef。

如果您處於多字節構建配置中,則需要MultiByteToWideChar(並且反之亦然)。

1

您可以使用:

wstring ws = L"Testing123"; 
string s(ws.begin(), ws.end()); 
// s.c_str() is what you're after 
2

in general這是不可能的,因爲wchar_t可能與TCHAR的大小不一樣。

已經列出了幾種用於字符集之間轉換的解決方案。如果字符集與要轉換的範圍重疊,這些可以工作。

我喜歡儘可能完全迴避這個問題,並使用已在TCHAR字符集定義的標準字符串,如下所示:使用此

typedef std::basic_string<TCHAR> tstring;

你現在有一個標準庫兼容的字符串,它是也與Windows TCHAR宏兼容。

5

使用本:

wstring str1(L"Hello world"); 
TCHAR * v1 = (wchar_t *)str1.c_str(); 
+0

錯誤C2440:'初始化':無法從'wchar_t *'轉換爲'TCHAR *' – Deqing 2016-05-24 00:44:52

+0

完美地工作。謝謝。 – 2016-08-30 17:39:28