Comment puis-je convertir un std::string
en LPCSTR
? Aussi, comment puis-je convertir un std::string
en LPWSTR
?
Je suis totalement confus avec ceux LPCSTR
LPSTR
LPWSTR
- ci et LPCWSTR
.
Sont LPWSTR
et LPCWSTR
les mêmes?
str.c_str()
vous donne un const char *
, qui est un LPCSTR
(Long Pointer to Constant STRing) - signifie qu'il s'agit d'un pointeur vers une 0
chaîne de caractères terminée. W
signifie chaîne large (composée de wchar_t
au lieu de char
).
Appelez
c_str()
pour obtenir unconst char *
(LPCSTR
) d'unstd::string
.Tout est dans le nom:
LPSTR
- (long) pointeur vers la chaîne -char *
LPCSTR
- (long) pointeur vers une chaîne constante -const char *
LPWSTR
- (long) pointeur vers la chaîne Unicode (large) -wchar_t *
LPCWSTR
- (long) pointeur vers une chaîne Unicode (large) constante -const wchar_t *
LPTSTR
- (long) pointeur vers TCHAR (Unicode si UNICODE est défini, ANSI sinon) chaîne -TCHAR *
LPCTSTR
- (long) pointeur vers la chaîne TCHAR constante -const TCHAR *
Vous pouvez ignorer la partie L (longue) des noms - c'est un héritage de Windows 16 bits.
la source
Ce sont des typedefs définis par Microsoft qui correspondent à:
LPCSTR: pointeur vers la chaîne const terminée par null de
char
LPSTR: pointeur vers la chaîne de caractères terminée par null de
char
(souvent un tampon est passé et utilisé comme paramètre de 'sortie')LPCWSTR: pointeur vers la chaîne terminée par null de const
wchar_t
LPWSTR: pointeur vers la chaîne terminée par null de
wchar_t
(souvent un tampon est passé et utilisé comme paramètre de 'sortie')La "conversion"
std::string
de a en LPCSTR dépend du contexte exact, mais il.c_str()
suffit généralement d'appeler .Cela marche.
Notez que vous ne devriez pas essayer de faire quelque chose comme ça.
Le tampon renvoyé par
.c_str()
appartient à l'std::string
instance et ne sera valide que jusqu'à ce que la chaîne soit modifiée ou détruite.Convertir a
std::string
en aLPWSTR
est plus compliqué. Vouloir uneLPWSTR
implique que vous avez besoin d' un tampon modifiable et vous devez également être sûr que vous comprenez ce que l' encodage des caractères l'std::string
utilise. Si lestd::string
contient une chaîne utilisant le codage par défaut du système (en supposant que Windows, ici), vous pouvez trouver la longueur du tampon de caractères larges requis et effectuer le transcodage en utilisantMultiByteToWideChar
(une fonction API Win32).par exemple
la source
En utilisant,
LPWSTR
vous pouvez modifier le contenu de la chaîne vers laquelle elle pointe. En utilisant,LPCWSTR
vous ne pouvez pas modifier le contenu de la chaîne vers laquelle elle pointe.LPWSTR
est juste un pointeur vers la chaîne d'origine. Vous ne devez pas le renvoyer à partir de la fonction en utilisant l'exemple ci-dessus. Pour ne pas être temporaire,LPWSTR
vous devez faire une copie de la chaîne d'origine sur le tas. Vérifiez l'exemple ci-dessous:la source
La
MultiByteToWideChar
réponse que Charles Bailey a donnée est la bonne. Comme ilLPCWSTR
s'agit simplement d'un typedef pourconst WCHAR*
,widestr
dans l'exemple de code, il peut être utilisé partout où aLPWSTR
est attendu ou où aLPCWSTR
est attendu.Un ajustement mineur serait d'utiliser
std::vector<WCHAR>
au lieu d'un tableau géré manuellement:De plus, si vous avez besoin de travailler avec des chaînes larges pour commencer, vous pouvez utiliser à la
std::wstring
place destd::string
. Si vous souhaitez travailler avec leTCHAR
type Windows , vous pouvez utiliserstd::basic_string<TCHAR>
. La conversion destd::wstring
versLPCWSTR
ou destd::basic_string<TCHAR>
versLPCTSTR
est juste une question d'appelsc_str
. C'est lorsque vous changez entre les caractères ANSI et UTF-16 quiMultiByteToWideChar
(et son inverseWideCharToMultiByte
) entre en jeu.la source
La conversion est simple:
std :: string str; LPCSTR lpcstr = str.c_str ();
la source
La conversion est simple:
Une chose à faire attention ici est que c_str ne renvoie pas une copie de myString, mais juste un pointeur vers la chaîne de caractères que std :: string encapsule. Si vous voulez / avez besoin d'une copie, vous devrez en créer une vous-même en utilisant strcpy.
la source
Le moyen le plus simple de convertir un
std::string
en unLPWSTR
est à mon avis:std::string
enstd::vector<wchar_t>
wchar_t
dans le vecteur.std::vector<wchar_t>
a un ctor basé sur un modèle qui prendra deux itérateurs, tels que les itérateursstd::string.begin()
et.end()
. Cela convertira chaque caractère en awchar_t
, cependant. Ce n'est valable que si lestd::string
contient ASCII ou Latin-1, en raison de la façon dont les valeurs Unicode ressemblent aux valeurs Latin-1. S'il contient du CP1252 ou des caractères d'un autre encodage, c'est plus compliqué. Vous devrez ensuite convertir les personnages.la source
std::wstring
?myString est la chaîne d'entrée et lpSTR est son équivalent LPSTR .
la source