簡體   English   中英

從 char16_t(utf16) 到 utf8 的轉換在 Visual Studio 2015 和 2017 中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM