¿Cómo puedo convertir un std::string
a LPCSTR
? Además, ¿cómo puedo convertir un std::string
a LPWSTR
?
Estoy totalmente confundido con estos LPCSTR
LPSTR
LPWSTR
y LPCWSTR
.
Son LPWSTR
y LPCWSTR
lo 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 0
cadena de caracteres terminada. W
significa cadena ancha (compuesta de en wchar_t
lugar 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
char
LPSTR: 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_t
LPWSTR: 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::string
a 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::string
instancia y solo será válido hasta que la cadena se modifique o destruya a continuación.Convertir a en
std::string
aLPWSTR
es más complicado. Queriendo unLPWSTR
implica 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::string
está utilizando. Sistd::string
contiene 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
LPWSTR
usarlo, podría cambiar el contenido de la cadena a donde apunta. El usoLPCWSTR
no pudo cambiar el contenido de la cadena a donde apunta.LPWSTR
es 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
MultiByteToWideChar
respuesta que dio Charles Bailey es la correcta. Debido a queLPCWSTR
es solo un typedef paraconst WCHAR*
,widestr
en el código de ejemplo se puede usar dondeLPWSTR
se espere a o dondeLPCWSTR
se 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::wstring
lugar destd::string
. Si desea trabajar con elTCHAR
tipo de Windows , puede usarstd::basic_string<TCHAR>
. La conversión destd::wstring
aLPCWSTR
o destd::basic_string<TCHAR>
aLPCTSTR
es 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::string
a en aLPWSTR
es:std::string
astd::vector<wchar_t>
wchar_t
en el vector.std::vector<wchar_t>
tiene un ctor con plantilla que tomará dos iteradores, como los iteradoresstd::string.begin()
y.end()
. Sinwchar_t
embargo, esto convertirá cada carácter en un . Eso solo es válido sistd::string
contiene 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