2008-10-29 74 views
48

有什麼方法嗎? 我的電腦是AMD64。我想將std :: string轉換爲常量wchar_t *

::std::string str; 
BOOL loadU(const wchar_t* lpszPathName, int flag = 0); 

當我用:

loadU(&str); 

的VS2005編譯器說:

Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *' 

我該怎麼辦呢?

回答

35

如果你有一個std :: wstring的對象,你可以調用它的c_str()獲得wchar_t*

std::wstring name(L"Steve Nash"); 
const wchar_t* szName = name.c_str(); 

因爲你是在一個狹窄的字符串操作,但是,你首先需要擴大它。這裏有各種選擇;一種是使用Windows內置的MultiByteToWideChar例程。這會給你一個LPWSTR,相當於wchar_t*

+0

或簡單地做一個`string var = L「text」;` – cybermonkey 2014-11-09 17:13:20

+2

@ʎǝʞuoɯɹǝqʎɔ:你的意思是`wstring var = L「text」;` – 2015-03-12 20:45:43

75

首先將其轉換爲std :: wstring的:

std::wstring widestr = std::wstring(str.begin(), str.end()); 

然後得到的C字符串:

const wchar_t* widecstr = widestr.c_str(); 

這隻適用於ASCII字符串,但如果基礎字符串是它不會工作UTF-8編碼。使用像MultiByteToWideChar()這樣的轉換例程可確保正確處理此場景。

+3

這對ASCII字符串應該可以正常工作,但是如果底層字符串是UTF-8編碼的。使用像MultiByteToWideChar()這樣的轉換例程可確保正確處理此場景。 – 2008-10-29 13:50:05

+0

您應該使用MultiByteToWideChar和正確的代碼頁。確切地說,需要對它進行兩次調用:第一次獲得目標wchar_t字符串所需的長度,第二次將char字符串轉換爲wchar_t字符串。 – 2008-10-30 08:56:37

8

您可以使用ATL文本轉換宏將窄(char)字符串轉換爲寬(wchar_t)字符串。例如,轉換爲std :: string:

#include <atlconv.h> 
... 
std::string str = "Hello, world!"; 
CA2W pszWide(str.c_str()); 
loadU(pszWide); 

你也可以指定代碼頁,所以如果你的std :: string包含UTF-8字符,你可以使用:

CA2W pszWide(str.c_str(), CP_UTF8); 

非常有用但只有Windows。

4

如果您在Linux/Unix上查看GNU C(來自ISO C 90)中定義的mbstowcs()和wcstombs()。

  • mbs表示「多字節字符串」,基本上是通常的零終止C字符串。

  • wcs代表寬字符串,是一個wchar_t數組。

欲瞭解寬字符的更多背景信息,請查看glibc文檔here