Узнать кодировку консоли windows

Сбилась кодировка в командной строке. Как исправить

Проблема: в консоли кириллические символы отображаются в неверной кодировке (в народе «кракозябры»):

При этом, если выполнить команду

кириллица становится читаемой только для текущего сеанса. А при перезапуске командной строки кодировка снова сбивается. Если у вас ситуация выглядит так же, то это означает, что неверные параметры кодовой страницы берутся из реестра и решать проблему нужно именно там.

Как установить правильную кодировку в консоли

Запустите редактор реестра:

Откройте раздел HKEY_CURRENT_USER\Console и проверьте значение параметра CodePage (должно быть 866).

В нашем примере на картинке мы видим, что в параметре по какой-то причине указана кодировка 1251, что бесспорно и является причиной появления абракадабры.

Если у вас значение этого параметра отличается от 866, нажмите два раза по параметру CodePage:

Установите переключатель в положение Десятичная.

В поле Значение введите 866.

Нажмите OK:

Перезапустите командную строку (закройте окно и запустите его заново — Win+R, cmd, enter). Вы должны увидеть корректное отображение кириллицы:

Символы кириллицы в консоли Windows

Ходят упорные слухи, что в Linux нет проблем с работой с кириллицей в консоли. Эта статья для тех, кому повезло меньше — для виндузятников.

Проблема заключается в том, что когда в Microsoft придумывали Windows, то попутно придумали новую кодировку для кириллицы. Трудно сказать зачем, но придумали. А старую кодировку, которая использовалась в MS DOS, оставили. Видимо в целях обратной совместимости. И случилась жопа. С выходом новых версий Windows ситуация только ухудшилась. Т.к. консоль, уже как часть операционной системы, унаследовала кодировку кириллицы от MS DOS.

В итоге сейчас для кириллицы имеем две кодировки: cp866 — старая досовская кодировка и cp1251 (она же windows-1251) — новая, от Windows. В настоящее время дело осложняется тем, что окончательно созрел Unicode, что дает еще несколько кодировок не совместимых с cp1251 и с cp866, и не совсем совместимых между собой. Но о Unicode как-нибудь в другой раз.

Кстати, буковки «cp» в названии кодировки означает codepage — кодовая страница в смысле «страница кодировки символов».

Кроме того, консоль имеет собственную настройку кодовой страницы. Для России по умолчанию — cp866. (Локализация самой винды, по видимому, роли не играет). Настройка кодовой страницы консоли может быть изменена командой chcp .

Итак, при написании программ строки могут встречаться в двух различных кодировках в следующих местах:

  1. В исходных текстах программ в виде литералов.
  2. Вывод на консоль.
  3. Ввод с консоли.
  4. Вывод в файл.
  5. Ввод из файла.

Кроме того, винда при вводе и выводе кириллицы где-то в своих глубинах может делать некие преобразования кодировок, выдавая результаты, не поддающиеся расшифровке.

Первое правило при работе с национальными алфавитами: все строки должны быть в единой кодировке.

При несоблюдении этого правила будет невозможно сравнение и сортировка строк (а также и символов), и будет затруднён корректный ввод и вывод строк на консоль или в файл.

Еще один подводный камень:

В окне консоли, использующем растровые шрифты (Raster fonts), корректно отображается только кодовая страница оригинального производителя оборудования (OEM), установленная с Windows XP. Другие кодовые страницы отображаются корректно в полноэкранном режиме или в окне консоли, которое использует шрифты True Type.

При этом в самой консоли отображение кириллицы при вводе (в командной строке) работает даже при использовании растровых шрифтов.

Читайте также:  Узнать имя пк по ip внутри сети linux

Второе правило при работе с национальными алфавитами: в настройках консоли установите для вывода шрифт True Type.

Сделать это можно следующим способом:

  1. Запустите командную строку
  2. Откройте контекстное меню и зайдите в настройки консоли
  3. Измените шрифт на Lucida Console.

И еще. Похоже, что ни Unicode, ни UTF-8, ни мультибайтовые строки в консоли напрямую не поддерживаются. По крайней мере, у меня с ними ничего путного не вышло.

Далее несколько советов для борьбы с этими проблемами.

Самый простой (и самый неудобный) способ

Работать в «родной» для консоли кодовой странице, в cp866. Т.е. все строки с кириллицей в исходном коде программы должны быть написаны в кодировке cp866. В этой же кодировке должны быть все входные файлы для программы. И в этой же кодировке будут и все выходные файлы. Полное впечатление, что мы вернулись на 20 лет назад, в MS DOS.

Если под рукой есть IDE, которая работает в консоли — особых проблем не возникнет. Если же использовать среду разработки под Windows GUI, то возникают вполне понятные сложности, поскольку IDE обычно работают в кодировке cp1251, «родной» для Windows. Кстати, как бы ни хаяли MS Visual Studio, она умеет работать с исходными текстами программ в различных кодировках, корректно их отображая в своем редакторе.

Вывод на консоль Windows 7

Способ подходит, если необходим только вывод кириллицы на консоль, и вы работаете под Windows 7. Под Windows XP это не работает (прим. редактора — все работает).

Самое простое — использовать функцию setlocale() :

Функция setlocale() устанавливает или изменяет для текущей программы информацию о национальной специфике (то, что задается в апплете Region and Language в Control panel). Описание функции можно найти в MSDN.

Также популярен урезанный вариант вызова:

Здесь используется, что символ LC_ALL равен 0 и подразумевается, что в операционной системе установлена страна пребывания Россия (локализация самой Винды роли не играет). Но лучше все-таки использовать полную форму.

Функция достаточно капризная. Это касается второго параметра. Некоторые значения, которые указаны в документации, могут на каких-то системах (компиляторах?) не работать.

Ввод и вывод на консоль

Для корректного ввода и вывода кириллицы на консоль надо использовать пару функций: SetConsoleOutputCP() и SetConsoleCP() . Описания в MSDN здесь и здесь соответственно.

В качестве единственного параметра обеим функциям передается номер кодовой страницы. В нашем случае (кириллица) — это 1251.

Этот способ работает и для Windows XP, и для Windows 7. Опробовано с Dev-C++ 5.6.3 (компилятор TDM-GCC 4.8.1 и MS Visual Studio 2012.

Следующая тестовая программа демонстрирует вывод кириллицы на консоль, ввод кириллической строки с консоли, контрольный вывод введенной строки, сравнение введенной строки с эталонной и вывод введенной строки в файл.

Исходный текст в кодировке cp1251:

Эта программа также удобна для экспериментов с различными кодовыми таблицами и их сочетаниями.

Для практических целей можно использовать шаблон:

Здесь я намеренно оставил закомментированный вызов setlocale(LC_ALL, «Russian»); . На ввод-вывод кириллицы он уже не влияет, но может потребоваться для других национальных настроек (разделитель дробной части числа, формат даты, времени и пр.)

Функции перекодировки

В Windows API есть две (а точнее, четыре пары) функции, осуществляющие перекодировку OEM ANSI (так сказано в документации). Проще говоря, в контексте рассматриваемого вопроса, это перекодировка между cp866 (OEM) и cp1251 (ANSI).

«Опасные» функции без контроля длины строки:

В качестве параметров получают указатели на входной и выходной буферы. Нулевой символ считается концом входной строки.

«Безопасные» функции с контролем длины строки:

В качестве параметров получают указатели на входной и выходной буферы и количество символов для входной строки. Нулевые символы не считаются концом строки. Преобразуется указанное количество символов.

Читайте также:  Windows volume over 100

На самом деле перечисленные функции являются макросами, которые раскрываются, к примеру для CharToOemBuff , в CharToOemBuffW (при поддержке Unicode) или в CharToOemBuffA (ANSI — без поддержки Unicode). Но о таких тонкостях обычно можно не вспоминать.

Эти функции полезны, когда вывод идёт в одной кодировке, а ввод — в другой. Такая ситуация складывается, например, при использовании только функции setlocale() : вывод осуществляется в cp1251, а ввод — в cp866. Следуя первому правилу, введенную строку надо преобразовать к cp1251. Для этого используется OemToCharBuff() .

Также эти функции могут быть использованы перед выводом строки в файл или после ввода строки из файла, в случае, если кодировки не совпадают.

P. S. Не судите строго — это мой первый опыт в написании статьи. Я так посмотрел, люди пишут, а чем я хуже? Тем более, что появилось чем поделиться. А оказалось, что это трудно. И написать, и ошибки проверить, и иллюстрации подготовить.

На написание статьи меня сподвиг вопрос о «кракозябрах в XP». Под это дело из руин даже был извлечен старый комп с XP. И оказалось, что проблема действительно имеет место. Пришлось провести небольшое исследование, результаты которого я здесь и изложил. Также скомпилировал доступную информацию по этой теме из материалов сайта, что бы все было в одном месте. Насколько у меня это получилось — решать вам. Буду рад замечаниям и дополнениям в комментариях к статье.

Кодировка в консоли

Кодировка в консоли
поставил VisualStudio, там подтянул Node все запускается и работает. почти все ) даже если.

Кодировка в консоли
Добрый день , имея некоторый опыт программирования на c# решил так же изучить С++, однако при.

Кодировка консоли
Добрый день. Не удается мне понять, что не так. Как только я не игрался с setLocale и.

Кодировка в консоли VS
Здравствуйте! Проблема вот в чём: Необходимо, чтобы текст отображался точно также, как в.

сохраните его в любой кодировке и посмотрите на его работу.

И немного по поводу вашей методики:

Давайте я выступлю в качестве третейского судьи )

Есть разные способы сделать так, чтобы с помощью батника создать новый текстовый файл с русским текстом в кодировке UTF-8.
Это зависит от того, в какой кодировке сохранен сам батник.

1) Как предложил Smitis, можно сам батник сохранить в UTF-8 без BOM,
тогда простая строка:

создаст файл 1.txt в UTF-8 без BOM.
Из минусов: собственные сообщения вида echo Привет будут выводится в консоль некорректно,
хотя внутренние сообщения от команд вполне читабельны.

2) Вариант amel27.
Здесь батник сохранен в кодировке OEM (cp866).

Магия заключается именно в однострочной команде с использованием канала:

Создаст файл config.txt с UTF-8 без BOM.

При попытке заменить знак канала на & получим испорченные данные на месте символов кириллицы.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Кодировка в консоли(C)
Здравия Я к вам с очередной проблемой:)Читал сейчас тему русские шрифты в консоли и задался.

Кодировка в консоли VS
Есть код. В нем конструкция проверяющая введенные данные. (Типа примитивной авторизации).

Неправильная кодировка в консоли
#include «stdafx.h» #include using namespace std; const int strsize = 20; int main().

Кодировка символов в консоли
Напомните ещё один способ установки кодовой страницы в консоли для визуал студии, по крайней мере.

Запуск консольной программы с кодировкой win1251

Есть исполняемый файл консольной windows программы. В программе есть сообщения кириллицей в кодировке win-1251. При этом программа в процессе работы создает тектовый файл с данными. Для корректного отображения текста как в консоли так и в текстовом файле нужно запустить программу в терминале с предустановленной кодировкой win-1251. Сделать это можно командой chcp 1251.

Читайте также:  Дравера для windows 10

Задача в том, что бы не нагружать пользователя лишней работой, тем более если он не знает как это сделать. Пусть запускает bat файл который:

  1. Откроет консоль, и желательно раскроет ее пошире (если это можно сделать из bat).
  2. Изменит кодировку консоли на win-1251
  3. Запустит в консоли программу programma.exe
  4. После завершения работы exe файла закроет консоль

Каталог с bat и exe файлами может быть положен пользователем в любую директорию файловой системы windows. Важно, что бы запуск был возможен отовсюду.

Просьба написать текст такого bat файла.

ps Файл должен получиться короткий, прошу помочь, у меня винды нет, пользователь другой ОС.

Автоматизация консольной программы
Нужна помощь с консольной программой mkvmerge. К ней имеется предположим данные параметры.

Запуск и получение данных от консольной программы
Есть консольная программа *.exe написанная на C, выводит в консоль 2 строки. Нужно из программы на.

Запуск и получение данных из консольной программы *.exe
Есть консольная программа *.exe написанная на C, выводит в консоль 2 строки. Нужно из программы на.

Запуск консольной программы из программы
Добрый день Всем! Хотел изнутри Qt-шной программы запустить следующую команду под Виндой: echo.

Решение

Отчасти да, отчасти нет.

programma.exe может быть скомпилирована c любой кодировкой, но суть именно в том, что бы корректно отображалась кириллица как в терминале, так и в создаваемом этой программой текстовом файле, поэтому нужна кодировка win-1251.

Другой путь, без bat файла, можно скомпилировать программу с кодировкой CP866. В этом случае вывод данных в консоль будет производится корректно, но для корректности вывода сообщений в текстовый файл в программу придется встраивать модуль перекодирования 866-1251, это сделать можно, но больше возни и меньше универсальности. Хотя не исключено, что попробую оба метода.

разве не ОС создает файл (ну да, по пинку из программы) в той кодировке, в которой ей гласит приложение отвечающее за создание и чтение этих файлов, notepad.exe — штатный блокнот windows по умолчанию и в кодировке 1251. Например у меня стоит его замена на AkelPad и по умолчанию файлы txt создаются и открываются в кодировке 866, так что проблем с кириллицей практически никогда нет.

Добавлено через 3 минуты

Это программа не только для меня, если я напишу, что для ее запуска и корректного чтения созданных ею файлов нужно поставить еще какую то стороннюю программу, то отношение к идее будет отрицательным. Для чтения файлов нужно использовать только штатный блокнот.

Это специализированный математический расчет из области электротехники. Вряд ли это кому то интересно и важно в контексте данной темы.

Работу bat файла и первого прообраза программы попробовал на винде. Возник вопрос.

1. Запуском bat файла запускается консоль
2. Меняется кодировка на win-1251 (проверил это подстановкой в bat файл команд chcp и pause перед запуском файла programma.exe)
3. Программа запускается с корректным отображением кириллицы

Кодовая страница консоли по умолчанию 866, то же проверено (это видно во время паузы, по команде chcp пишется что то вида: «╪шЁюър¤ых 1251» вместо «кодовая страница 1251»).

Фокус в том, что программа скомпилирована с кодировкой CP866 для тестирования с непосредственным запуском, без bat-файла.
Т.е. в первом варианте я непосредственно мышью запускаю programma.exe и вижу корректное отображение. Во втором варианте я запускаю ее же через bat файл со сменой кодировки в 1251 и то же вижу корректное отображение кириллицы. В чем подвох?

ps вывод в файл на винде еще не проверен, эта возможность есть только в следующей версии программы, пока существующей только в linux версии.

Оцените статью