Il codecvt non è un’intestazione standard?

Questo codice viene compilato con Visual C ++ 11 e viene eseguito come previsto su Windows 7, ma non riesce a compilare utilizzando MinGW 4.7.0 su Windows 7 o gcc 4.8.0 su Linux. Compilando con -std=c++11 flag

 #include  #include  // convert UTF-8 string to wstring std::wstring utf8_to_wstring (const std::string& str) { std::wstring_convert<std::codecvt_utf8> myconv; return myconv.from_bytes(str); } // convert wstring to UTF-8 string std::string wstring_to_utf8 (const std::wstring& str) { std::wstring_convert<std::codecvt_utf8> myconv; return myconv.to_bytes(str); } 

Errore:

codecvt: nessun file o directory di questo tipo.

Il motivo per cui GCC rifiuta questo codice è semplice: libstdc ++ non supporta ancora .

La pagina di stato del supporto C ++ 11 conferma questo:

22.5 Sfaccettature standard per la conversione del codice N

La domanda è stata fatta quasi 3 anni fa e sono rimasto sorpreso dal fatto che anch’io sto avendo lo stesso problema usando Ubuntu 14.04 con nuovi aggiornamenti.

Seconda sorpresa, il link fornito da @Fanael mostra ora:

22.5 Sfaccettature di conversione codice standard Y

Così ho cercato quale versione di GCC avrebbe implementato pienamente C ++ 11. Risulta che è stato aggiunto il supporto completo in GCC 5:

https://gcc.gnu.org/gcc-5/changes.html

Pieno supporto per C ++ 11, incluse le seguenti nuove funzionalità:

sfaccettature locali per la conversione Unicode;

Sarei stato felice di mettere un commento sulla risposta se avessi abbastanza reputazione 🙂

Una soluzione alternativa utilizzando Boost.Locale :

 #include  #include  using boost::locale::conv::utf_to_utf; std::wstring utf8_to_wstring(const std::string& str) { return utf_to_utf(str.c_str(), str.c_str() + str.size()); } std::string wstring_to_utf8(const std::wstring& str) { return utf_to_utf(str.c_str(), str.c_str() + str.size()); } 

Funziona su Ubuntu 14.04 con gcc 5.3.