Преобразование шестнадцатеричного значения в символ wchar_t (UTF-8) - PullRequest
0 голосов
/ 05 ноября 2018

Я держу шестнадцатеричные значения в целых числах без знака 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 ++ решение для этого?

Мне нужно иметь возможность печатать что-нибудь в диапазоне 0000-27BF UTF-8 только на linux .

1 Ответ

0 голосов
/ 06 ноября 2018

Для печати широких символов вместо std::cout.

требуется std::wcout с приведением 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::wcout << (wchar_t) el << " "; // <--- Corrected statement

    return 0;
}

Выход:

☮ ☾ ☮

Если у вас есть шестнадцатеричные номера строк, вы можете следовать этому решению.

...