son que poner etiquetas etiqueta encabezado ejemplos definicion cursiva como c++ c++11

c++ - que - tags h1 ejemplos



¿Codecvt no es un encabezado estándar? (4)

Este código se compila con Visual C ++ 11 y se ejecuta como se esperaba en Windows 7, pero no se puede compilar con MinGW 4.7.0 en Windows 7 o gcc 4.8.0 en Linux. Compilando con -std=c++11 flag

#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); }

Error:

codecvt: No hay tal archivo o directorio.


Funciona en Ubuntu 14.04 con gcc 5.3.


La pregunta fue hecha hace casi 3 años y me sorprendió que también tenga el mismo problema al usar Ubuntu 14.04 con nuevas actualizaciones.

Segunda sorpresa, el enlace proporcionado por @Fanael muestra ahora:

22.5 facetas de conversión de código estándar

Entonces busqué qué versión de GCC implementaría completamente C ++ 11. Resulta que se agregó soporte completo en GCC 5:

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

Soporte completo para C ++ 11, incluidas las siguientes características nuevas:

...

las facetas de configuración regional para la conversión de Unicode;

...

Hubiera estado feliz de poner un comentario sobre la respuesta si tuviera suficiente reputación :)


La razón por la que GCC rechaza este código es simple: libstdc ++ aún no es compatible con <codecvt> .

La página de estado de soporte C ++ 11 confirma esto:

22.5 facetas de conversión de código estándar N


Una solución usando 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()); }