[英]Conversion from char16_t(utf16) to utf8 doesn't work in visual studio 2015 and 2017
我想將數據類型char16_t
轉換為 utf8,為此我編寫了以下代碼:
// utf16 String
char16_t *wchs = u"UTF16 string";
// A converter object
wstring_convert<codecvt_utf8_utf16<char16_t>, char16_t> conv;
// Convert from utf16 to utf8
string str = conv.to_bytes(wchs);
// print the UTF-16 string after converting to UTF-8
cout << str << endl;
無論是 2015 年還是 2017 年,前面的代碼在 Visual Studio 中都不起作用,特別是“char16_t”數據類型,並給我一個錯誤:
error LNK2001: unresolved external symbol "public: static class std::locale::id std::codecvt<char16_t,char,struct _Mbstatet>::id" (?id@?$codecvt@_SDU_Mbstatet@@@std@@2V0locale@2@A)
,
但在 GCC 編譯器中運行良好。
為什么會發生這種情況以及如何解決該問題?
您可能不走運,因為這似乎是一個 Visual Studio 錯誤,因為 VS 開發人員社區頁面上至少有 3 個帖子描述了給定的問題
他們都在哪里 state
固定在:visual studio 2019 版本 16.2
沒有跡象表明向后移植到 VS 2015 甚至 VS 2017。
這是一個簡單的 function 如何從 std::u16string 轉換為 std::string。 它適用於 VS 2017。
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() );
}
原因是wstring_convert<codecvt_utf8_utf16<char16_t>, char16_t> conv;
由於缺少static locale::id id;
在 .cpp 文件中。 int16_t 類型正在工作。
在 Linux 和 gcc 或 clang 編譯器套件下,從 std::u16string 轉換要容易一些。 static locale::id id;
.
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 );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.