Вывод 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 с помощью командной консоли:
- Запустите командное окно с
cmd /u
,/u
говорит, что ваши программы будут выводить Unicode. - использование
chcp 65001
чтобы указать, что вы хотите использовать UTF-8 вместо одной из кодовых страниц. - Выберите шрифт с большим количеством символов. Командные окна в более новых версиях 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";
и это сработало для большинства персонажей, которых я пробовал.