J'ai une chaîne dans char * code> format et souhaitez le convertir en wchar_t * code>, pour passer à une fonction Windows. P>
4 Réponses :
Cette petite fonction aide-t-elle?
#include <cstdlib> int mbstowcs(wchar_t *out, const char *in, size_t size);
Si vous ne voulez pas mettre un lien avec la bibliothèque d'exécution C, utilisez l'appel d'API multibytetowidechar, E.G:
const size_t WCHARBUF = 100; const char szSource[] = "HELLO"; wchar_t wszDest[WCHARBUF]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szSource, -1, wszDest, WCHARBUF);
Selon l'endroit où vient votre chaîne, vous pouvez également envisager CP_UTF8 au lieu de CP_ACP. Il peut stocker tous les caractères Unicode.
Pour moi sur Windows10 avec Visual Studio 2017, CP_ACP a travaillé. Cp_utf8 n'a pas fait.
Le SDK Windows Spécifie 2 fonctions dans Kernel32.Lib pour convertir des chaînes de et vers un ensemble de caractères large. Ce sont MultiByteTowidechar () Code> et widechartomultibyte () < / code> . p>
Veuillez noter que, contrairement au nom de la fonction suggère, la chaîne n'utilise pas nécessairement un jeu de caractères multi-octets, mais peut être une simple chaîne ANSI. ALSE Notez que ces fonctions comprennent UTF-7 et UTF-8 en tant que jeu de caractères multi-octets. Le grand jeu de caractères de caractère est toujours UTF-16. p>
La réponse de Schnaader Utilisez la conversion définie par la locale C actuelle C, celle-ci utilise l'interface locale C ++ (qui a déclaré qu'elle était simple?)
std::wstring widen(std::string const& s, std::locale loc)
{
std::char_traits<wchar_t>::state_type state = { 0 };
typedef std::codecvt<wchar_t, char, std::char_traits<wchar_t>::state_type >
ConverterFacet;
ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc));
char const* nextToRead = s.data();
wchar_t buffer[BUFSIZ];
wchar_t* nextToWrite;
std::codecvt_base::result result;
std::wstring wresult;
while ((result
= converter.in
(state,
nextToRead, s.data()+s.size(), nextToRead,
buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite))
== std::codecvt_base::partial)
{
wresult.append(buffer, nextToWrite);
}
if (result == std::codecvt_base::error) {
throw std::runtime_error("Encoding error");
}
wresult.append(buffer, nextToWrite);
return wresult;
}
La plupart des fonctions Windows viennent en deux saveurs, une version "A" et "W". Par exemple. Messageboxa / MessageBoxw, avec une macro "MessageBox", faisant référence à l'une des deux. Mais si vous utilisez le nom Explicit
Messageboxa CODE>, vous pouvez transmettre unchar * code> indépendamment des paramètres du projet.