十六进制值到wchar_t字符(UTF-8)的转换

时间:2018-11-05 12:16:06

标签: c++ linux c++14

我将十六进制值保存在无符号整数size_t中,并希望将它们转换为wchar_t以保存在数据结构中,并可以选择将其打印为std::cout,因为它是UTF-8符号/字符有效。

我尝试了投射,但没有成功:例如,size_t h = 0x262E;在投射到9774时会打印wchar_t

一些最少的代码:

#include <iostream>
#include <vector>

int main() {
   std::setlocale( LC_ALL, "" );
   auto v = std::vector<size_t>( 3, 0x262E ); // 3x peace symbols
   v.at( 1 ) += 0x10; // now a moon symbol

   for( auto &el : v )
       std::cout << el << " ";

    return 0;
}

输出:9774 9790 9774 我想要的是:☮ ☾ ☮

我可以使用printf( "%lc ", (wchar_t) el );打印符号。是否有更好的“现代” C ++解决方案?

我需要能够在的Linux上打印0000-27BF UTF-8范围内的任何内容。

1 个答案:

答案 0 :(得分:2)

您需要使用std::wcoutwchar_t强制转换来打印宽字符而不是std::cout

这是您更正的功能代码(live example):

#include <iostream>
#include <vector>

int main() {
   std::setlocale( LC_ALL, "" );
   auto v = std::vector<size_t>( 3, 0x262E ); // 3x peace symbols
   v.at( 1 ) += 0x10; // now a moon symbol

   for( auto &el : v )
       std::wcout << (wchar_t) el << " "; // <--- Corrected statement

    return 0;
}

输出:

☮ ☾ ☮

如果您有十六进制字符串,则可以遵循this解决方案。