45 votes

codecvt n'est-il pas un en-tête std ?

Ce code se compile avec Visual C++ 11 et s'exécute comme prévu sous Windows 7, mais ne se compile pas avec MinGW 4.7.0 sous Windows 7 ou gcc 4.8.0 sous Linux. Compilation avec -std=c++11 drapeau

#include <codecvt>
#include <string>

// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> 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<wchar_t>> myconv;
    return myconv.to_bytes(str);
}

Erreur :

codecvt : No such file or directory.

31voto

La raison pour laquelle GCC rejette ce code est simple : libstdc++ ne prend pas en charge la fonction <codecvt> encore.

En Page d'état du support du C++11 le confirme :

22.5 Facettes de conversion du code standard N

23voto

lderache Points 263

La question a été posée il y a presque 3 ans et j'ai été surpris de constater que j'ai le même problème en utilisant Ubuntu 14.04 avec les dernières mises à jour.

Deuxième surprise, le lien fourni par @Fanael montre maintenant :

22.5 Facettes de conversion du code standard Y

J'ai donc cherché quelle version de GCC permettait d'implémenter complètement C++11. Il s'avère que le support complet a été ajouté dans GCC 5 :

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

Prise en charge complète de C++11, y compris les nouvelles fonctionnalités suivantes :

...

facettes locales pour la conversion Unicode ;

...

J'aurais été heureux de mettre un commentaire sur la réponse si j'avais eu assez de réputation :)

22voto

jotrocken Points 1506

Une solution de contournement consiste à utiliser Boost.Locale :

#include <boost/locale/encoding_utf.hpp>
#include <string>

using boost::locale::conv::utf_to_utf;

std::wstring utf8_to_wstring(const std::string& str)
{
    return utf_to_utf<wchar_t>(str.c_str(), str.c_str() + str.size());
}

std::string wstring_to_utf8(const std::wstring& str)
{
    return utf_to_utf<char>(str.c_str(), str.c_str() + str.size());
}

2voto

Maks Points 1072

Il fonctionne sur Ubuntu 14.04 avec gcc 5.3.

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