¿Cómo puedo convertir un std::stringa LPCSTR? Además, ¿cómo puedo convertir un std::stringa LPWSTR?
Estoy totalmente confundido con estos LPCSTR LPSTR LPWSTRy LPCWSTR.
Son LPWSTRy LPCWSTRlo mismo?
str.c_str()le da a const char *, que es un LPCSTR(Long Pointer to Constant STRing) - significa que es un puntero a una 0cadena de caracteres terminada. Wsignifica cadena ancha (compuesta de en wchar_tlugar de char).
Llame
c_str()para obtener unconst char *(LPCSTR) de unstd::string.Todo está en el nombre:
LPSTR- (largo) puntero a cadena -char *LPCSTR- puntero (largo) a cadena constante -const char *LPWSTR- puntero (largo) a la cadena Unicode (ancho) -wchar_t *LPCWSTR- puntero (largo) a una cadena Unicode (ancha) constante -const wchar_t *LPTSTR- puntero (largo) a TCHAR (Unicode si se define UNICODE, ANSI si no) cadena -TCHAR *LPCTSTR- puntero (largo) a una cadena TCHAR constante -const TCHAR *Puede ignorar la parte L (larga) de los nombres; es un vestigio de Windows de 16 bits.
fuente
Estos son typedefs definidos por Microsoft que corresponden a:
LPCSTR: puntero a una cadena constante terminada en nulo de
charLPSTR: puntero a una cadena de caracteres terminada en nulo de
char(a menudo se pasa un búfer y se usa como un parámetro de 'salida')LPCWSTR: puntero a una cadena de const terminada en nulo
wchar_tLPWSTR: puntero a una cadena terminada en nulo de
wchar_t(a menudo se pasa un búfer y se usa como un parámetro de 'salida')Para "convertir"
std::stringa en LPCSTR depende del contexto exacto, pero normalmente llamar.c_str()es suficiente.Esto funciona.
Tenga en cuenta que no debe intentar hacer algo como esto.
El búfer devuelto por
.c_str()es propiedad de lastd::stringinstancia y solo será válido hasta que la cadena se modifique o destruya a continuación.Convertir a en
std::stringaLPWSTRes más complicado. Queriendo unLPWSTRimplica que se necesita un búfer modificable y también es necesario para asegurarse de que entiende lo que la codificación de caracteres de lastd::stringestá utilizando. Sistd::stringcontiene una cadena que usa la codificación predeterminada del sistema (asumiendo windows, aquí), entonces puede encontrar la longitud del búfer de caracteres anchos requerido y realizar la transcodificación usandoMultiByteToWideChar(una función de API de Win32).p.ej
fuente
Al
LPWSTRusarlo, podría cambiar el contenido de la cadena a donde apunta. El usoLPCWSTRno pudo cambiar el contenido de la cadena a donde apunta.LPWSTRes solo un puntero a la cadena original. No debe devolverlo desde la función usando el ejemplo anterior. Para que no sea temporalLPWSTR, debe hacer una copia de la cadena original en el montón. Verifique la muestra a continuación:fuente
La
MultiByteToWideCharrespuesta que dio Charles Bailey es la correcta. Debido a queLPCWSTRes solo un typedef paraconst WCHAR*,widestren el código de ejemplo se puede usar dondeLPWSTRse espere a o dondeLPCWSTRse espere a.Un pequeño ajuste sería usar en
std::vector<WCHAR>lugar de una matriz administrada manualmente:Además, si necesita trabajar con cadenas anchas para empezar, puede usar en
std::wstringlugar destd::string. Si desea trabajar con elTCHARtipo de Windows , puede usarstd::basic_string<TCHAR>. La conversión destd::wstringaLPCWSTRo destd::basic_string<TCHAR>aLPCTSTRes solo una cuestión de llamadac_str. Es cuando estás cambiando entre caracteres ANSI y UTF-16 queMultiByteToWideChar(y su inversoWideCharToMultiByte) entra en escena.fuente
La conversión es simple:
std :: string str; LPCSTR lpcstr = str.c_str ();
fuente
La conversión es simple:
Una cosa a tener en cuenta aquí es que c_str no devuelve una copia de myString, sino solo un puntero a la cadena de caracteres que std :: string envuelve. Si desea / necesita una copia, deberá hacer una usted mismo usando strcpy.
fuente
En mi opinión, la forma más sencilla de convertir
std::stringa en aLPWSTRes:std::stringastd::vector<wchar_t>wchar_ten el vector.std::vector<wchar_t>tiene un ctor con plantilla que tomará dos iteradores, como los iteradoresstd::string.begin()y.end(). Sinwchar_tembargo, esto convertirá cada carácter en un . Eso solo es válido sistd::stringcontiene ASCII o Latin-1, debido a la forma en que los valores Unicode se parecen a los valores Latin-1. Si contiene CP1252 o caracteres de cualquier otra codificación, es más complicado. Luego, deberá convertir los caracteres.fuente
std::wstring?myString es la cadena de entrada y lpSTR es su equivalente a LPSTR .
fuente