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

Я все еще изучаю С++, так что несите меня и мой неряшливый код. Компилятор, который я использую, - Dev С++. Я хочу иметь возможность выводить символы 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. Почему это так, и как я могу показать ĐĄßĞĝ? Или это невозможно в Windows?

Ответ 1

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

#include <iostream>

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Кроме того, используйте std:: cin.get(), а не систему ( "ПАУЗА" )

Ответ 4

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

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

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