Задать вопрос
MegaCraZy6
@MegaCraZy6
Юзерь

C++ как вывести аски смайл, не указывая код?

Знакомый сказал, что он выбрал С#, потому-что в С++
'☺' Работает не правильно, может кто-то обьяснить почему?
И как можно вывести всё-же этот смайл, не указывая код напрямую?)
  • Вопрос задан
  • 2745 просмотров
Подписаться 1 Простой 11 комментариев
Решения вопроса 2
Под 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);
    }
}
Ответ написан
Vapaamies
@Vapaamies
Психанул и снес свои ответы не отмечающим решения…
Представленный вами символ Юникода U+263A не влезает в ASCII. Его можно вывести только в UTF-8, предварительно перекодировав из UTF-16. Нужно создать проект Unicode (не Multibyte). На чистом Си будет примерно так:
#include <windows.h>

int main()
{
    TCHAR c = _T("☺");
    char utf8[4]; // max UTF-8 charater bytes
    DWORD bytesWritten;
    DWORD cp;

    WideCharToMultiByte(CP_UTF8, 0, *c, 1, *utf8, 4, NULL, NULL);
    cp = GetConsoleOutputCP;
    SetConsoleOutputCP(CP_UTF8);
    WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), *utf8, sizeof(utf8), *bytesWritten, NULL);
    SetConsoleOutputCP(cp); // возвращаем назад для других консольных приложений в том же окне

    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@anikavoi
Вопрос разбивается на два:
1) Как зафигачить в char 0x01 ascii не используя цифр
2) Как заставить систему его показывать правильно.

Первый вопрос банален:
char c=' '; c--; c--;... и так 31 раз.
Второй тоже банален - set console
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы