Русские буквы в консоли — знаки вопроса и кракозябры
Добавьте в начало программы установку кодировки:
using System.Text;
Console.OutputEncoding = Encoding.UTF8;
if (OperatingSystem.IsWindows())
{
Console.InputEncoding = Encoding.Unicode;
}
Console.Write("Как вас зовут? ");
string name = Console.ReadLine() ?? "";
Console.WriteLine($"Привет, {name}!");Console.OutputEncoding = Encoding.UTF8;— программа выводит текст в UTF-8, в котором есть любые буквы и символы.Console.InputEncoding = Encoding.Unicode;— в Windows .NET читает набранное с клавиатуры прямо в Unicode, и русские буквы вConsole.ReadLine()не теряются. В Linux и macOS терминал и так работает в UTF-8, а эта настройка там испортила бы ввод — поэтому она под проверкойOperatingSystem.IsWindows().
Почему так бывает
Консоль Windows по традиции работает в своей кодовой странице — таблице символов. В русской Windows это обычно страница 866, в английской — 437, в которой русских букв нет вовсе. Символ, которого нет в странице, превращается в ?. Когда программа и консоль понимают текст в разных кодировках, вместо букв получаются «кракозябры» — бессмысленные символы.
В .NET 8 и новее на русской Windows русские буквы обычно выводятся правильно и без настроек. Проблемы бывают на английской Windows, со знаками вне страницы 866 (белорусские і, знак €, эмодзи) и при выводе в файл. Строки из начала этой справки решают эти случаи.
Другой способ — chcp
Переключить кодовую страницу можно и командой в окне командной строки перед запуском программы:
chcp 65001
dotnet run65001 — номер страницы UTF-8. Действует только в этом окне до его закрытия и помогает прежде всего с выводом; для ввода русских букв надёжнее Console.InputEncoding из примера выше.
Буквы испорчены ещё в коде
Если русский текст выглядит неправильно уже в редакторе, или программа выводит не те буквы даже с настройками выше, файл .cs сохранён не в той кодировке. Пересохраните его в UTF-8: в VS Code — щелчок по названию кодировки в строке состояния внизу окна и «Save with Encoding» → UTF-8.
Подводные камни
- Настройку пишут до первого вывода или ввода — лучше первыми строками программы.
- Знаки вопроса могут быть и из-за шрифта: если шрифт консоли не содержит буквы, она показывается квадратом или
?. В Windows Terminal и современных консолях Windows 10 и 11 шрифт по умолчанию кириллицу показывает. - Если вывод программы перенаправляют в файл (
dotnet run > out.txt), сEncoding.UTF8файл будет в UTF-8. - В Unity консольных окон нет:
Debug.Logпоказывает русский текст в окне Console редактора без настроек.