240 votes

Comment convertir wstring en chaîne?

La question est de savoir comment convertir wstring à la chaîne?

J'ai l'exemple suivant :

#include <string>
#include <iostream>

int main()
{
    std::wstring ws = L"Hello";
    std::string s( ws.begin(), ws.end() );

  //std::cout <<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;
    std::cout <<"std::string =     "<<s<<std::endl;
}

la sortie avec en commentaire de la ligne est :

std::string =     Hello
std::wstring =    Hello
std::string =     Hello

mais sans n'est :

std::wstring =    Hello

Est quelque chose de mal dans l'exemple? Je peux faire la conversion, comme ci-dessus?

MODIFIER

Nouvel exemple (en tenant compte de certaines réponses)

#include <string>
#include <iostream>
#include <sstream>
#include <locale>

int main()
{
    setlocale(LC_CTYPE, "");

    const std::wstring ws = L"Hello";
    const std::string s( ws.begin(), ws.end() );

    std::cout<<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;

    std::stringstream ss;
    ss << ws.c_str();
    std::cout<<"std::stringstream =     "<<ss.str()<<std::endl;
}

La sortie est :

std::string =     Hello
std::wstring =    Hello
std::stringstream =     0x860283c

par conséquent, les stringstream ne peut pas être utilisé pour convertir wstring en chaîne.

362voto

dk123 Points 1635

Comme Cubbi a souligné dans un des commentaires, std::wstring_convert (C++11) fournit un cadre soigné solution la plus simple:

wstring string_to_convert;

//setup converter
typedef std::codecvt_utf8<wchar_t> convert_type;
std::wstring_convert<convert_type, wchar_t> converter;

//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes( string_to_convert );

J'ai été en utilisant une combinaison de wcstombs et fastidieux d'allocation/désallocation de la mémoire avant je suis tombé sur cette.

http://en.cppreference.com/w/cpp/locale/wstring_convert

mise à jour(2013.11.28)

L'un des paquebots peut être énoncé comme (Merci Guss pour votre commentaire):

std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some string");

Fonctions Wrapper peut être énoncé de la manière suivante: (Merci ArmanSchwarz pour votre commentaire)

wstring s2ws(const std::string& str)
{
    typedef std::codecvt_utf8<wchar_t> convert_typeX;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.from_bytes(str);
}

string ws2s(const std::wstring& wstr)
{
    typedef std::codecvt_utf8<wchar_t> convert_typeX;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.to_bytes(wstr);
}

Remarque: il ya une certaine controverse sur si les chaînes/wstring doit être passé à fonctions en tant que références ou des littéraux (en raison de c++11 et le compilateur mises à jour); je vais laisser la décision à la personne qui met en œuvre, mais il est utile de connaître.

Note: je suis à l'aide d' std::codecvt_utf8 dans le code ci-dessus, mais si vous n'êtes pas l'utilisation de l'utf-8, vous aurez besoin de le changer pour le codage approprié que vous utilisez:

http://en.cppreference.com/w/cpp/header/codecvt

155voto

namar0x0309 Points 884

Solution de: http://forums.devshed.com/c-programming-42/wstring-to-string-444006.html

 std::wstring wide( L"Wide" ); 
std::string str( wide.begin(), wide.end() );

// Will print no problemo!
std::cout << str << std::endl;
 

35voto

Philipp Points 21479

Voici une solution élaborée basée sur les autres suggestions:

 #include <string>
#include <iostream>
#include <clocale>
#include <locale>
#include <vector>

int main() {
  std::setlocale(LC_ALL, "");
  const std::wstring ws = L"ħëłlö";
  const std::locale locale("");
  typedef std::codecvt<wchar_t, char, std::mbstate_t> converter_type;
  const converter_type& converter = std::use_facet<converter_type>(locale);
  std::vector<char> to(ws.length() * converter.max_length());
  std::mbstate_t state;
  const wchar_t* from_next;
  char* to_next;
  const converter_type::result result = converter.out(state, ws.data(), ws.data() + ws.length(), from_next, &to[0], &to[0] + to.size(), to_next);
  if (result == converter_type::ok or result == converter_type::noconv) {
    const std::string s(&to[0], to_next);
    std::cout <<"std::string =     "<<s<<std::endl;
  }
}
 

Cela fonctionnera généralement sous Linux, mais créera des problèmes sous Windows.

13voto

Justin Kirk Points 736

Au lieu d’inclure les paramètres régionaux et les trucs de tout ce que fantaisie, si vous connaissez de fait votre chaîne est convertible seulement procédez comme suit :

Exemple de vivre ici

6voto

Mark Lakata Points 3458

Ce n’est pas la réponse à la question en litige, mais il peut être utile aux gens qui fait une recherche de SO sur « convertir string wstring » et a atterri ici.

Voici une façon à la combinaison de chaîne, wstring et constantes de chaîne mixte à wstring. Utilisez la classe wstringstream.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X