2013-08-14 4 views
1

Je suis nouveau en C++ et j'ai ce problème. J'ai une chaîne appelée DATA_DIR dont j'ai besoin pour le format dans un wstring.Comment convertir une chaîne en wstring en utilisant la valeur de la chaîne?

string str = DATA_DIR; 
std::wstring temp(L"%s",str); 

Visual Studio me dit qu'il n'y a pas d'instance de constructeur qui correspond à la liste des arguments. Clairement, je fais quelque chose de mal.

Je trouve cet exemple en ligne

std::wstring someText(L"hello world!"); 

qui fonctionne apparemment (pas d'erreur de compilation). Ma question est, comment puis-je obtenir la valeur de chaîne stockée dans DATA_DIR dans le constructeur wstring par opposition à quelque chose d'arbitraire comme "bonjour monde"?

+0

duplication possible de [Comment faire pour convertir std :: string en LPCWSTR en C++ (Unicode)] (http://stackoverflow.com/questions/27220/how-to-convert-stdstring-to-lpcwstr-in-c -unicode) – Ani

+0

Consultez http://www.utf8everywhere.org/ et pensez à utiliser la bibliothèque boost :: nowide fournie sur cette page pour convertir la chaîne en wstring et en arrière. Rend la vie beaucoup plus facile :) – Tom

+0

Quel est le codage du texte dans 'string'? Habituellement soit ISO/CEI 8859-1 (Ce que beaucoup appellent incorrectement "ASCII") ou UTF-8. –

Répondre

6

Voici une implémentation en utilisant wcstombs (Mis à jour):

#include <iostream> 
#include <cstdlib> 
#include <string> 

std::string wstring_from_bytes(std::wstring const& wstr) 
{ 
    std::size_t size = sizeof(wstr.c_str()); 
    char *str = new char[size]; 
    std::string temp; 

    std::wcstombs(str, wstr.c_str(), size); 

    temp = str; 
    delete[] str; 

    return temp; 
} 

int main() 
{ 
    std::wstring wstr = L"abcd"; 
    std::string str = wstring_from_bytes(wstr); 
} 

Here is a demo.

0

J'ai trouvé cette fonction. Impossible de trouver une méthode prédéfinie pour cela.

std::wstring s2ws(const std::string& s) 
{ 
    int len; 
    int slength = (int)s.length() + 1; 
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len]; 
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len); 
    std::wstring r(buf); 
    delete[] buf; 
    return r; 
} 

std::wstring stemp = s2ws(myString); 
+0

Ceci n'utilise pas la bibliothèque standard. Cela ressemble à Win32. – Potatoswatter

+0

Oui, ce n'est pas en utilisant la bibliothèque standard. Asker utilise Visual Studio. Cela peut être utile s'il utilise WINAPI. –

+0

Et que fait exactement 'CP_ACP'? Il semble spécifier le codage non-multi-octets défini par le système. Cette API rend très difficile l'écriture portable. – Potatoswatter

0

printf spécificateurs de format -style ne font pas partie de la bibliothèque C++ et ne peuvent pas être utilisés pour Construire un string.

Si le string ne peut contenir que des caractères codés sur un octet, le constructeur de plage est suffisant.

std::string narrower("hello"); 
std::wstring wider(narrower.begin(), narrower.end()); 

Le problème est que nous utilisons habituellement wstring lorsque les caractères larges sont applicables (d'où le w), qui sont représentés dans std::string par des séquences multi-octets. Cela entraînera la traduction de chaque octet d'une séquence multi-octets en une séquence de caractères larges incorrects.

De plus, pour convertir une séquence multi-octets nécessite de connaître son encodage. Cette information n'est pas encapsulée par std::string ni std::wstring. C++ 11 vous permet de spécifier un encodage et de traduire à l'aide de std::wstring_convert, mais je ne suis pas certain de sa compatibilité. Voir l'excellente réponse de 0x ....

Questions connexes