Настройка консоли:Unicode, размер, шрифт (корректный ввод/вывод строк с кириллицей, пробелами, знаками юникода) С++
Простой способ больше не вспоминать о кодировках CP866, ANSI(рус.:CP1251) и костылях, типа "setlocale(LC_ALL, "Russian")" или "SetConsoleCP(1251); SetConsoleOutputCP(1251);" Применимо (протестировано) для Microsoft Visual Studio. В данном блоге я не буду рассматривать разные способы ввода\вывода в консоль строк с нужной кодировкой и их дальнейшего корректного использования в коде (в сети их предостаточно) Я рассмотрю и подробно распишу - один, который, по моему мнению, довольно прост, универсален и снимает все проблемы с вводом/выводом строк на разных языках, в т.ч. с пробелами. Этот способ - переход на Unicode. Если точнее, то на Unicode(UTF-16) - стандартный 2-х байтный (16-битный). Родной для Win (UTF-16LE) и других программ. Итак, если вам это подходит, прошу к дальнейшему чтению и обсуждению... Шаг.1 Создаем проект "Unicode" в Студии ("Файл"-"Создать проект"-"С++-консольное приложение") Меняем
или в общепринятый UTF-8 (в Студии по умолчанию кодировка для проектов "UTF-8 с сигнатурой", оставляем её) Шаг.4 Добавляем возможность поменять размер окна (если вам не нужно можно эту часть пропустить) и сам шрифт (для возможности отображать Unicode-символы) - я выбрал стандартный, присутствующий у всех - Lucida Console. Если у вас установлен нужный шрифт с поддержкой нужных вам символов, эту часть то же можно пропустить.
Я написал тест для двух вариантов, используя "std::" и не используя, выбирайте нужный вам.
Кликните здесь для просмотра всего текста
https://msdn.microsoft.com/ru-... 2147217396
https://msdn.microsoft.com/ru-... k6df8.aspx https://docs.microsoft.com/en-... ont-infoex обсуждение на stackoverflow, здесь ссылка рубится, не могу выложить Мой репозиторий на GitHub В итоге, см.рис. |
Всего комментариев 19
Комментарии
-
Должно быть так в коде:
wprintf(L"%s", L"Testing unicode -- English -- Русский -- Ελληνικά -- Español.\n");
// или
std::wcout << L"Testing unicode -- English -- Русский -- Ελληνικά -- Español." << std::endl;
Здесь, на сайте, в текст. редакторе С++ отображаются, видимо, не все знаки Юникода, о чем собственно говорится в Шаг.4 или кодировка не Unicode(UTF-16).
Для этого комментария выбрал шрифт "Lucida Console".Запись от bedvit размещена 07.12.2017 в 13:24 -
Запись от Avazart размещена 07.12.2017 в 17:07
Обновил(-а) Avazart 07.12.2017 в 17:09 -
Все верно, поэтому есть Шаг.3 - исходники в UTF-16. Ибо в противном случае, текст из исходников (в "const wchar_t") будет отражаться не верно, ведь типов wchar_t и char16_t, std::wstring - 16 битные.
А UTF-8 (1-4 байта в зависимости от символа, насколько я знаю).
Конечно, если вы работаете с char или std::string, то для ввода/вывода консоли нужно будет перейти на широкие символы, это не всегда удобно, но в моем случае это было несложно (проект маленький)Запись от bedvit размещена 07.12.2017 в 19:09 -
Запись от bedvit размещена 07.12.2017 в 19:29 -
Запись от Avazart размещена 08.12.2017 в 20:23 -
сp1251 это русская ansi, в не локализованной win кириллица и прочие языки выводиться не будут. Чем удобен UTF-16: почти все символы 2 байта (4 только спец. китайский, музыкальные символы и прочая экзотика), wchar_t то же два байта, win на UTF-16 (api тоже) Все в одном размере, не нужно преобразований. Размер строки легко считается. Работает на любом win (кроме старокитайского) с вводом/отображением почти всех языков. Минусы - несколько большой объём занимаемой памяти.
Запись от bedvit размещена 09.12.2017 в 00:07 -
Запись от Avazart размещена 09.12.2017 в 00:20
Обновил(-а) Avazart 09.12.2017 в 00:25 -
Windows-1251 (сp1251) это русская ansi (расширенная ascii, в которой часть символов, со 128-го, заменены/добавлены на русский алфавит и проч. символы), т.е. одна из разновидности набора ANSI, содержащая символы русского алфавита. Собственно поэтому и гемор с разными локализациями при использовании ANSI(локализованных) .
Да, и ввод и вывод работает на русском и других языках, можете попробовать
В приложенном рис. это строки 4-5, 7-8 (ввод-вывод).Запись от bedvit размещена 09.12.2017 в 21:54 -
Запись от Avazart размещена 10.12.2017 в 14:19 -
Запись от Avazart размещена 10.12.2017 в 14:40 -
Да, шаг.3 необходим для данного решения. Сфера применения - или новые проекты или проекты, легко переходящие с UTF-8, на UTF-16 или для тех, кто и так пользуется wchar_t или std::wstring. Минусом - нужно больше памяти под проект и под строку. Плюсом - нормальная кодировка почти всех языков на всех win, любой локализации.
Запись от bedvit размещена 10.12.2017 в 14:49 -
Запись от bedvit размещена 10.12.2017 в 14:51 -
Запись от Avazart размещена 10.12.2017 в 14:51
Обновил(-а) Avazart 10.12.2017 в 14:52 -
Запись от bedvit размещена 10.12.2017 в 15:45 -
Запись от Avazart размещена 10.12.2017 в 18:06 -
Запись от Замабувараев размещена 05.05.2018 в 14:34 -
Все-таки переводить исходники в UTF-16 не нужно. Компилятор перекодирует строки, помеченные префиксом
L
.
Файл в может быть спокойно в UTF-8, как общепринято.Запись от DrOffset размещена 28.06.2020 в 18:42 -
Запись от bedvit размещена 26.10.2022 в 11:01 -
Запись от Замабувараев размещена 26.10.2022 в 19:23