Comment convertir CString et ::std::string ::std::wstring les uns les autres?
CString
est très pratique, tout en std::string
est plus compatible avec les conteneur STL.
Je suis à l'aide de hash_map
. Cependant, hash_map
ne prend pas en charge CString
sous forme de clé, donc je veux convertir CString
en std::string
.
L'écriture d'un CString
fonction de hachage semble prendre beaucoup de temps.
CString -----> std::string
Comment puis-je faire cela?
std::string -----> CString:
inline CString toCString(std::string const& str)
{
return CString(str.c_str());
}
Suis-je droit?
EDIT:
Voici plus de questions:
Comment puis-je convertir wstring
, CString
les uns les autres?
//wstring -> CString,
std::wstring src;
CString result(src.c_str());
//CString->wstring.
CString src;
::std::wstring des(src.GetString());
Est-il tout problème?
Comment puis-je convertir std::wstring
, std::string
les uns les autres?
- Je ne voudrais pas le faire... à l'Aide de deux cordes différentes types est assez mauvaise, mais avoir à les convertir à chaque fois que vous faites quelque chose avec une carte? Le son est terrible. D'être cohérente et de les utiliser std::string. Si pour quelque raison vous pensez vraiment CString est mieux, puis de définir une fonction de hachage pour vos classes hash_map pouvez l'utiliser, c'est beaucoup mieux que le doublement de la confusion dans votre code.
- En fait, Si tout le code est écrit par moi, il sera compatible, mais il y a quelques opensourced projet comme freeimage sqlite utilisé. Je ne peux pas modifier le code.
- J'ai répondu à un contemporain de réponse (VS2017 MFC ...Depuis VS2012)
Vous devez vous connecter pour publier un commentaire.
Selon CodeGuru:
CString
àstd::string
:MAIS:
std::string
ne peut pas toujours construire à partir d'unLPCTSTR
. c'est à dire le code suivant ne fonctionnera pas pour les générations de UNICODE.Comme
std::string
peut construire que deLPSTR
/LPCSTR
, un programmeur qui utilise VC++ 7.x ou mieux peut utiliser la conversion des classes commeCT2CA
comme un intermédiaire.std::string
àCString
: (À partir de Visual Studio CString foire aux questions...)CStringT
peut construire à partir de deux caractères ou large-les chaînes de caractères. c'est à dire Il peut convertir dechar*
(c'est à direLPSTR
) ou dewchar_t*
(LPWSTR
).En d'autres termes, char-spécialisation (de
CStringT
) c'est à direCStringA
,wchar_t
-specilizationCStringW
, etTCHAR
-spécialisationCString
peuvent être construits à partir soitchar
ou de grand caractère,null (null-résiliation est très important ici)string sources.Althoug IInspectable modifie la valeur "null-résiliation" partie dans les commentaires:
NUL
-la résiliation n'est pas nécessaire.CStringT
a la conversion des constructeurs de prendre explicitement un argument de longueur. Cela signifie également que vous pouvez construireCStringT
objets destd::string
objets embarquésNUL
caractères.Résoudre que par l'utilisation de
std::basic_string<TCHAR>
au lieu destd::string
et il devrait fonctionner indépendamment de votre personnage réglage.typedef std::basic_string<TCHAR> tstring
Il est plus efficace pour convertir
CString
àstd::string
à l'aide de la conversion où la longueur est spécifiée.En boucle serrée, cela permet une amélioration significative de la performance.
cannot convert parameter 1 from 'CString' to 'const std::basic_string<_Elem,_Traits,_Alloc> &'
Si vous voulez quelque chose de plus similaire à C++, c'est ce que j'utilise. Bien que cela dépend de Boost, c'est juste pour les exceptions. Vous pouvez facilement supprimer les laisser ne dépendent de la STL et de la
WideCharToMultiByte()
appel Win32 API.(Depuis VS2012 ...et au moins jusqu'à VS2017 v15.8.1)
Puisque c'est un projet MFC & CString est une classe MFC, MS fournit une Note Technique TN059: à l'Aide de MFC MBCS de Conversion Unicode/Macros et Générique de Macros de Conversion:
Utilisation:
--
Notes de bas de page:
(1) afin de pour la conversion des macros pour avoir de l'espace pour stocker la temporaire de longueur, il est nécessaire de déclarer une variable locale appelée
_convert
qui fait cela dans chaque fonction qui utilise les macros de conversion. Cela se fait en invoquant laUSES_CONVERSION
macro. Dans VS2017 code MFC (atlconv.h) il ressemble à ceci:USES_CONVERSION
n'est pas nécessaire lors de l'utilisation ATL 7.0 la chaîne de conversion les macros. ATL 7.0 est fourni avec Visual Studio 2003.C'est un suivi pour Sal de réponse, où il/elle a fourni la solution:
C'est également utile lors de la conversion d'un non-typique C-String pour un std::string
Un cas d'utilisation pour moi était d'avoir une pré-alloués char array (comme le C-String), mais il n'est pas NUL résilié. (c'est à dire condensé SHA).
La syntaxe ci-dessus me permet de spécifier la longueur de la condensé SHA de la char tableau afin que std::string n'avons pas à chercher pour la résiliation de NUL char, qui peut ou peut ne pas être là.
Tels que:
Cela fonctionne bien:
de ce post (Merci Marque Rançon )
Convertir CString à chaîne (VC6)
Je l'ai testé et il fonctionne très bien.
Fonctionne pour moi:
WStringToCString
échoue pour n'importe quel caractère non-ASCII dans la chaîne source.CStringToWString
échoue pour n'importe quel caractère non-ASCII ainsi, la production non valide code UTF-16 unités. Je comprends que cette solution ne cesse d'apparaître à chaque fois, mais il a toujours été mauvais, et il continuera à être mauvais.Toutes les autres réponses n'ai pas très bien répondre à ce que je cherchais qui était de convertir
CString
à la volée plutôt que de stocker le résultat dans une variable.La solution est similaire à ci-dessus, mais nous avons besoin d'une étape de plus pour instancier un objet sans nom. Je suis là pour illustrer avec un exemple. Voici ma fonction qui doit
std::string
mais j'aiCString
.Comment l'appeler quand vous avez un
CString
?Noter que la dernière ligne n'est pas direct catalogué, mais nous sommes de la création d'un inconnu
std::string
objet et d'approvisionnement de laCString
via son constructeur.Il y a plusieurs problèmes:
CString
est un modèle de la spécialisation de CStringT. Selon le BaseType décrivant le type de caractères, il y a deux spécialisations:CStringA
(à l'aide dechar
) etCStringW
(à l'aide dewchar_t
).wchar_t
sur Windows est ubiquitaire utilisé pour stocker codé en UTF-16 unités de code, à l'aide dechar
est ambigu. Le dernier couramment magasins ANSI caractères codés, mais peut également stocker des caractères ASCII, UTF-8, ou même des données binaires.CString
(qui est contrôlé par la_UNICODE
symbole de préprocesseur), faisant de la question de l'ambiguïté. Nous ne savons pas non plus que le caractère souhaité encodage destd::string
.Pour répondre à ces questions, je vais supposer que
wchar_t
va stocker codé en UTF-16 unités de code, etchar
tiendra UTF-8 octet séquences. C'est le seul choix raisonnable que vous pouvez faire pour s'assurer que la source et la destination des chaînes de conserver la même information, sans préjudice de la solution à un sous-ensemble de la source ou de la destination domaines.Les implémentations suivantes convertir entre
CStringA
/CStringW
etstd::wstring
/std::string
cartographie de l'UTF-8, UTF-16 et vice versa:Les deux autres fonctions de construire la chaîne C++ objets de la sfm, cordes, laissant le codage inchangé. Notez que, bien que les fonctions précédentes ne peuvent pas faire face avec embedded NUL, les personnages, ces fonctions sont à l'abri de cela.
Vous pouvez utiliser CT2CA
Si vous êtes à la recherche pour convertir facilement entre les autres types de chaînes, peut-être le
_bstr_t
classe serait plus approprié? Il prend en charge converstion entrechar
,wchar_t
etBSTR
.CString
déjà fait toutes les conversions de nom. Et il l'a fait il y a 3 ans ainsi. Pas de point dans ce qui suggère un type qui est conçu pour l'utilisation dans COM environnements.Une approche intéressante consiste à jeter
CString
àCStringA
à l'intérieur d'unstring
constructeur. Contrairement àstd::string s((LPCTSTR)cs);
ça va marcher, même si_UNICODE
est défini. Cependant, si c'est le cas, ce sera d'effectuer la conversion d'Unicode en ANSI, de sorte qu'il est dangereux pour la hausse des valeurs Unicode-delà du jeu de caractères ASCII. Une telle conversion est soumise à l'_CSTRING_DISABLE_NARROW_WIDE_CONVERSION
définition de préprocesseur. https://msdn.microsoft.com/en-us/library/5bzxfsea.aspxCString
a la conversion des constructeurs, en utilisant le thread appelant paramètres régionaux en cours. La conversion est à perte, et vous pouvez la fenêtre avec une chaîne qui ne représente plus la source. Oui, c'est facile, pratique. Mais aussi des mauvais._CSTRING_DISABLE_NARROW_WIDE_CONVERSION
symbole de préprocesseur est sûr: Il sera la cause de cette proposition de solution à l'échec de la compilation. Cette solution n'est même pas sûr si toutes les limitations sont compris, comme il n'y a aucun moyen de faire respecter les exigences.