Подтвердить что ты не робот

Является ли codecvt не std-заголовком?

Этот код компилируется с Visual С++ 11 и работает как ожидалось в Windows 7, но не может скомпилироваться с использованием MinGW 4.7.0 в Windows 7 или gcc 4.8.0 на Linux. Компиляция с флагом -std=c++11

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

Ошибка:

codecvt: Нет такого файла или каталога.

4b9b3361

Ответ 1

Причина, по которой GCC отвергает этот код, проста: libstdС++ еще не поддерживает <codecvt>.

страница статуса поддержки С++ 11 подтверждает следующее:

22.5 Границы преобразования стандартного кода N

Ответ 2

Вопрос был задан почти 3 года назад, и я был удивлен, что у меня также есть проблема с Ubuntu 14.04 со свежими обновлениями.

Второе удивление, ссылка, предоставленная @Fanael, теперь показывает:

22.5 Границы стандартного преобразования кода Y

Итак, я искал, какая версия GCC полностью реализует С++ 11. Оказывается, полная поддержка была добавлена ​​в GCC 5:

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

Полная поддержка С++ 11, включая следующие новые функции:

...

языковые грани для преобразования Юникода;

...

Я был бы рад написать комментарий, если у меня хватило репутации:)

Ответ 3

Обходной путь с использованием 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());
}  

Ответ 4

Он работает на Ubuntu 14.04 с gcc 5.3.