Глиф Учебники

Русские буквы в консоли — знаки вопроса и кракозябры

Справочник · C# · 2 минуты чтения

Добавьте в начало программы установку кодировки:

C#
using System.Text;

Console.OutputEncoding = Encoding.UTF8;
if (OperatingSystem.IsWindows())
{
    Console.InputEncoding = Encoding.Unicode;
}

Console.Write("Как вас зовут? ");
string name = Console.ReadLine() ?? "";
Console.WriteLine($"Привет, {name}!");

Почему так бывает

Консоль Windows по традиции работает в своей кодовой странице — таблице символов. В русской Windows это обычно страница 866, в английской — 437, в которой русских букв нет вовсе. Символ, которого нет в странице, превращается в ?. Когда программа и консоль понимают текст в разных кодировках, вместо букв получаются «кракозябры» — бессмысленные символы.

В .NET 8 и новее на русской Windows русские буквы обычно выводятся правильно и без настроек. Проблемы бывают на английской Windows, со знаками вне страницы 866 (белорусские і, знак €, эмодзи) и при выводе в файл. Строки из начала этой справки решают эти случаи.

Другой способ — chcp

Переключить кодовую страницу можно и командой в окне командной строки перед запуском программы:

Командная строка
chcp 65001
dotnet run

65001 — номер страницы UTF-8. Действует только в этом окне до его закрытия и помогает прежде всего с выводом; для ввода русских букв надёжнее Console.InputEncoding из примера выше.

Буквы испорчены ещё в коде

Если русский текст выглядит неправильно уже в редакторе, или программа выводит не те буквы даже с настройками выше, файл .cs сохранён не в той кодировке. Пересохраните его в UTF-8: в VS Code — щелчок по названию кодировки в строке состояния внизу окна и «Save with Encoding» → UTF-8.

Подводные камни