c++ stl visual-studio-2015 char16-t char32-t

Visual Studio C++ 2015 std:: codecvt con char16_t o char32_t



stl visual-studio-2015 (3)

Defina el símbolo que falta en un archivo cpp.

// Apparently Microsoft forgot to define a symbol for codecvt. // Works with /MT only #include <locale> #if (!_DLL) && (_MSC_VER >= 1900 /* VS 2015*/) && (_MSC_VER <= 1911 /* VS 2017 */) std::locale::id std::codecvt<char16_t, char, _Mbstatet>::id; #endif

Este código compilado OK bajo VS2013:

std::string Unicode::utf16_to_utf8(std::u16string utf16_string) { std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert; return convert.to_bytes(utf16_string); }

Ahora con VS2015 consigo:

1>unicode.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static class std::locale::id std::codecvt<char16_t,char,struct _Mbstatet>::id" (__imp_?id@?$codecvt@_SDU_Mbstatet@@@std@@2V0locale@2@A)


Otra solución posible es usar el segundo parámetro de plantilla predeterminado (wchar_t) para wstring_convert. Está funcionando para "MS Visual Studio 2015 actualización 3". Tenga en cuenta que no es una solución independiente de la plataforma . Solo Windows

std::string utf16_to_utf8(std::u16string u16_string) { std::wstring wide_string(u16_string.begin(), u16_string.end()); std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert; return convert.to_bytes(wide_string); }


Pregunta anterior, pero para referencia futura: este es un error conocido en Visual Studio 2015, como se explica en la última publicación (7 de enero de 2016) en este hilo de MSDN Social.

La solución para su ejemplo se ve así (implementé su método como una función gratuita para simplificar):

#include <codecvt> #include <locale> #include <string> #include <iostream> #if _MSC_VER >= 1900 std::string utf16_to_utf8(std::u16string utf16_string) { std::wstring_convert<std::codecvt_utf8_utf16<int16_t>, int16_t> convert; auto p = reinterpret_cast<const int16_t *>(utf16_string.data()); return convert.to_bytes(p, p + utf16_string.size()); } #else std::string utf16_to_utf8(std::u16string utf16_string) { std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert; return convert.to_bytes(utf16_string); } #endif int main() { std::cout << utf16_to_utf8(u"Élémentaire, mon cher Watson!") << std::endl; return 0; }

Con suerte, el problema se solucionará en versiones futuras, de lo contrario, la condición #if necesitará un refinado. ACTUALIZACIÓN: no, no se corrigió en VS 2017. Por lo tanto, he actualizado el preprocesador condicional a >= 1900 (inicialmente era == 1900 ).