2008-10-29 52 views
48

¿Hay algún método? Mi computadora es AMD64.Quiero convertir std :: string en un const wchar_t *

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

cuando utilicé:

loadU(&str); 

el compilador VS2005 dice:

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

¿Cómo puedo hacerlo?

Respuesta

35

Si usted tiene un objeto std :: wstring, puede llamar c_str() en él para obtener un wchar_t*:

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

Dado que se está operando en una cadena estrecha, sin embargo, primero tendría para ensancharlo . Aquí hay varias opciones; uno es usar la rutina incorporada de Windows MultiByteToWideChar. Eso le dará un LPWSTR, que es equivalente a wchar_t*.

+0

O simplemente haga un 'string var = L" text ";' – cybermonkey

+2

@ ʎǝʞuoɯɹǝqʎɔ: Quiere decir 'wstring var = L" text ";' –

75

Primera convertirlo en std :: wstring:

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

a continuación, obtener la cadena C:

const wchar_t* widecstr = widestr.c_str(); 

Esto sólo funciona para cadenas de caracteres ASCII, pero no va a funcionar si la cadena subyacente es UTF-8 codificado. El uso de una rutina de conversión como MultiByteToWideChar() garantiza que este escenario se maneje correctamente.

+3

Esto debería funcionar bien para cadenas ASCII, pero no funcionará si el subyacente la cadena está codificada en UTF-8. El uso de una rutina de conversión como MultiByteToWideChar() garantiza que este escenario se maneje correctamente. –

+0

Debe usar MultiByteToWideChar con la página de códigos correcta.Para ser precisos, se necesitan dos llamadas: la primera para obtener la longitud requerida de la cadena wchar_t objetivo y la segunda para convertir la cadena char a la cadena wchar_t. –

+0

Solo funcionará si wchar_t es Unicode y char es Latin-1 o ASSCII. Los primeros valores de 256 caracteres de Unicode coinciden exactamente con Latin-1; los primeros 128 caracteres de Latin-1 coinciden exactamente con ASCII. – MSalters

8

Puede usar las macros de conversión de texto ATL para convertir una cadena estrecha (char) en una ancha (wchar_t). Por ejemplo, para convertir un std :: string:

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

También puede especificar una página de códigos, así que si su std :: string contiene caracteres UTF-8 se puede utilizar:

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

muy útil, pero solo para Windows.

+0

Probablemente quieras CA2CW. También es posible que desee agregar una explicación básica para la convención de denominación de macros (por ejemplo: Const Ascii -> Const Wchar). – Nick

+0

No hay función de conversión CA2CW. Hay una versión CA2CT pero esto simplemente llama a CA2W. Ver para una lista completa. – Rob

+0

Increíblemente útil. En mi caso, solo '#include ' funcionó, mientras que '#include ' no. No se por que. – ceztko

4

Si está en Linux/Unix eche un vistazo a mbstowcs() y wcstombs() definidos en GNU C (de ISO C 90).

  • mbs significan "Multi Bytes String" y es básicamente la cadena C normal terminada en cero.

  • wcs significan Wide Char String y es una matriz de wchar_t.

Para más detalles del fondo en caracteres anchos echar un vistazo a la documentación glibc here.

+1

Creo que esos están en C estándar; De cualquier manera, también están en Windows: https://msdn.microsoft.com/en-us/library/k1f9b8cy.aspx –

Cuestiones relacionadas