Вывод Unicode на консоль с использованием C ++ в Windows - PullRequest
23 голосов
/ 17 мая 2010

Я все еще изучаю 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?

Ответы [ 4 ]

15 голосов
/ 17 мая 2010

А как же 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 (как описано в в этом ответе и задокументировано в в этом сообщении ).

6 голосов
/ 17 мая 2010

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

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

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

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

0 голосов
/ 09 января 2017

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

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

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

...