Вывод Unicode на консоль с использованием C++ в Windows

Я все еще изучаю C++, так что терпите меня и мой небрежный код. Я использую компилятор Dev C++. Я хочу иметь возможность выводить символы Unicode на консоль, используя cout. Всякий раз, когда я пробую такие вещи, как:

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    std::cout << "Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";
    system("PAUSE");
    return 0;
}

Он выводит на консоль странные символы, например, µA■Gg. Почему это происходит, и как я могу показать toßĞĝ? Или это невозможно с Windows?

5 ответов

Как насчет std::wcout?

#include <iostream>

int main() {
    std::wcout << L"Hello World!" << std::endl;
    return 0;
}

Это стандартный поток вывода широких символов.

Тем не менее, как указал Адриан, это не относится к факту cmdпо умолчанию не обрабатывает выходные данные Unicode. Эту проблему можно решить, настроив консоль вручную, как описано в ответе Адриана:

  • начало cmd с /u аргумент;
  • призвание chcp 65001 изменить формат вывода;
  • И установка шрифта Unicode в консоли (например, Lucida Console Unicode).

Вы также можете попробовать использовать _setmode(_fileno(stdout), _O_U16TEXT);, которые требуют fcntl.h а также io.h (как описано в этом ответе и задокументировано в этом блоге).

Вы можете использовать библиотеку {fmt} с открытым исходным кодом для переносимой печати текста Unicode, в том числе в Windows, например:

      #include <fmt/core.h>

int main() {
  fmt::print("Blah blah blah some gibberish unicode: ĐĄßĞĝ\n");
}

Выход:

      Blah blah blah some gibberish unicode: ĐĄßĞĝ

Это требует компиляции с /utf-8параметр компилятора в MSVC.

я не рекомендую использовать wcoutпотому что он не переносимый, например:

      std::wcout << L"Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";

распечатает ĐĄßĞĝчасть неправильно в macOS или Linux (https://godbolt.org/z/z81jbb):

      Blah blah blah some gibberish unicode: ??ss??

и даже не работает в Windows без изменения кодовой страницы:

      Blah blah blah some gibberish unicode:

Отказ от ответственности : я автор {fmt}.

Я не уверен, что Windows XP будет полностью поддерживать то, что вам нужно. Есть три вещи, которые вы должны сделать, чтобы включить Unicode с помощью командной консоли:

  1. Запустите командное окно с cmd /u, /u говорит, что ваши программы будут выводить Unicode.
  2. использование chcp 65001 чтобы указать, что вы хотите использовать UTF-8 вместо одной из кодовых страниц.
  3. Выберите шрифт с большим количеством символов. Командные окна в более новых версиях Windows предлагают Lucida Console Unicode, Моя коробка XP имеет подмножество того, что называется Lucida Console, У него нет очень обширного репертуара, но этого должно быть достаточно, если вы просто пытаетесь отобразить некоторые акцентированные символы.

Вы использовали выходной поток ANSI. Вам нужно использовать
std::wcout << L"Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";

Также используйте std::cin.get(), а не system("PAUSE")

В Linux я наивно могу сделать:

std::cout << "ΐ , Α, Β, Γ, Δ, ,Θ , Λ, Ξ, ... ±, ... etc";

и это сработало для большинства персонажей, которых я пробовал.

Другие вопросы по тегам