Под Linux, вроде, ничего не надо делать, стандартный терминал и так всё поддерживает, а ОС интерпретирует текст в char и string как UTF-8. Если хочешь Unicode под Windows, то добро пожаловать в адъ.
1. Убедись, что исходный код сохранён в UTF-8. Если Visual Studio, нужно немного потанцевать с бубном.
2. Куда вывести, в файл или в консоль? Вывести в стандартную консоль невозможно, нужно установить Windows Terminal, последнюю PowerShell и связать их (для этого ещё потанцевать с бубном).
3. В программе, перед тем как послать юникодную строку в ОС (например, перед тем как печатать), убедись, что ты перевёл её из UTF-8 в системную кодировку (которая обычно UTF-16). В стандартной библиотеке такого нет, нужно подключать либу. Вот что я юзаю с Boost и fmt:
namespace strings
{
using native_char = boost::filesystem::path::value_type;
using native_string = std::basic_string<native_char>;
namespace detail
{
inline void write(const std::string& string)
{
std::cout.write(string.c_str(), string.size());
}
inline void write(const std::wstring& string)
{
std::wcout.write(string.c_str(), string.size());
}
}
using fmt::format;
template <typename S, typename... Args>
void print(const S& format_str, Args&&... args)
{
const auto string = fmt::format(format_str, std::forward<Args>(args)...);
detail::write(boost::locale::conv::utf_to_utf<native_char>(string));
}
using boost::locale::conv::utf_to_utf;
using boost::locale::conv::from_utf;
using boost::locale::conv::to_utf;
using boost::locale::conv::between;
inline native_string to_native(const std::string& utf8)
{
return utf_to_utf<native_char>(utf8);
}
inline std::string from_native(const native_string& native)
{
return utf_to_utf<char>(native);
}
}