la conversion étroite chaîne à grande chaîne
Comment puis-je convertir un étroit string
à un large string
?
J'ai essayé cette méthode :
string myName;
getline( cin , myName );
wstring printerName( L(myName) ); //error C3861: 'L': identifier not found
wchar_t* WprinterName = printerName.c_str(); //error C2440: 'initializing' : cannot convert from 'const wchar_t *' to 'wchar_t *'
Mais j'ai des erreurs comme indiqué ci-dessus.
Pourquoi j'obtiens ces erreurs ? Comment puis-je corriger ?
Est-il de toute autre méthode de directement convertir un narrow
chaîne wide
chaîne ?
- la source est codé en UTF-8, ou ASCII?
Vous devez vous connecter pour publier un commentaire.
Ce faire, vous devez :
Ce qui attend la std::string pour être en UTF-8 (
CP_UTF8
), lorsque vous avez un autre codage de remplacer la page de codes.Une autre façon pourrait être :
Si la source est en ASCII codé, il vous suffit de faire ceci:
J'ai trouvé cette pendant googler le problème. J'ai collé le code de référence. Auteur de ce post est Paul McKenzie.
L"Hello";
. Deuxième erreur est auto-explicatif,c_str()
retourneconst wchar_t*
laquelle vous ne pouvez pas convertir àwchar_t*
.ATL (non-éditions Visual Studio express) a un couple utile types de classe qui peut convertir les chaînes de franchise. Vous pouvez utiliser le constructeur directement, si vous n'avez pas besoin de tenir sur la chaîne.
Voici deux fonctions qui peuvent être utilisées: mbstowcs_s et wcstombs_s.
mbstowcs_s: Convertit une séquence de caractères multioctets une séquence de caractères larges.
wcstombs_s: Convertit une séquence de caractères à une séquence de caractères multioctets.
);
Voir http://msdn.microsoft.com/en-us/library/eyktyxsx.aspx et http://msdn.microsoft.com/en-us/library/s7wzt4be.aspx.
L'API Windows fournit des routines pour ce faire: WideCharToMultiByte() et MultiByteToWideChar(). Cependant, ils sont une douleur à utiliser. Chaque conversion nécessite deux appels aux routines et vous avez de s'occuper d'allocation/libération de la mémoire et de s'assurer que les fils sont correctement terminé. Vous avez besoin d'un emballage!
J'ai une commode wrapper C++ sur mon blog, ici, que vous êtes invités à utiliser.
La question initiale de ce fil était: "Comment puis-je convertir une étroite chaîne à une grande chaîne?"
Cependant, à partir de l'exemple de code donné dans la question, il semble y avoir aucune conversion n'est nécessaire. Plutôt, il y a une erreur de compilation, en raison de la plus récente compilateurs autodérision quelque chose que l'habitude d'être d'accord. Voici ce que je pense est d'aller sur:
La c_str() semble être traités de la même manière comme un littéral, et est considéré comme une constante (const). Vous pouvez utiliser un cast. Mais il est préférable d'ajouter des const.
La meilleure réponse que j'ai vu pour la conversion entre les larges et étroites chaînes est d'utiliser std::wstringstream. Et c'est l'une des réponses données à C++ Convertir en chaîne de caractères (ou char*) à wstring (ou wchar_t*)
Vous pouvez convertir presque n'importe quoi et à partir de chaînes de caractères et les chaînes étendues à l'aide de stringstream et wstringstream.
Cet article publié sur le MSDN Magazine septembre 2016 numéro traite de la conversion en détails à l'aide des Api Win32.
Notez que l'utilisation de
MultiByteToWideChar()
est beaucoup plus rapide que d'utiliser les std:: trucs sur Windows.Utilisation mbtowc():