Преобразование текстового файла в UTF-8 в командной строке Windows

Время на прочтение

Хотелось бы узнать, каким способом в файлах с расширением .bat можно писать русским языком без иероглифов?

Nicolas Chabanovsky's user avatar

задан 12 янв 2012 в 16:40

I'm so sorry's user avatar

I’m so sorry
I’m so sorry

1 золотой знак
18 бронзовых знаков

 chcp 1251
echo тест
pause 

Только шрифт консоли нужно поменять на Lucida Console или Consolas

ответ дан 12 янв 2012 в 19:03

insolor's user avatar

17 золотых знаков
56 серебряных знаков
98 бронзовых знаков

Файлы создаются в кодировке cp866
, поэтому надо задавать charset=cp866
.

Nicolas Chabanovsky's user avatar

ответ дан 12 янв 2012 в 16:43

vv-d's user avatar

Мне помогло следующее решение:

 chcp 65001
echo тест
pause 

ответ дан 28 авг 2019 в 5:24

Vitaliy's user avatar

Вообще, вот

отличная таблица современных кодировок для виндового терминала.

Так, chcp с параметром 1251
поставит русскую кодировку, т.е CP1251(Windows-1251)
, а
с параметром 65001 – интернациональную кодировку UTF-8.

ответ дан 23 июн 2012 в 19:30

Free_man's user avatar

4 золотых знака
14 серебряных знаков
22 бронзовых знака

ответ дан 11 окт 2022 в 18:11

user523190's user avatar

Печать

Иногда по неизвестным причинам некоторые команды русскоязычной версии Windows выводят русский текст в нечитаемой кодировке, кракозябрами.

Например, команда help выводит нормальный текст:

cmd-normal-encoding-866

Но при этом подсказка telnet выводит в ответ кракозябры.

cmd-wrong-encoding-1251

Так может происходить, к примеру, если текущая кодировка консоли 866, а утилита telnet.exe почему-то выводит текст в кодировке 1251. Вывести текст в нужной кодировке поможет команда chcp
, которая устанавливает нужную кодировку.

Вот так можно посмотреть текущую кодировку консоли:

 c:\Documents and Settings\user>chcp
Текущая кодовая страница: 866
c:\Documents and Settings\user> 

А вот так можно поменять кодировку на 1251, после чего вывод подсказки telnet будет отображаться нормально:

 c:\Documents and Settings\user>chcp 1251
Текущая кодовая страница: 1251
c:\Documents and Settings\user> 

cmd-normal-encoding-1251

К сожалению, заранее угадать, в какой кодировке выводится текст, невозможно, поэтому проще попробовать установить командой chcp разные кодировки, чтобы добиться правильного отображения русского текста. Обычно используются кодировки 866
(кодировка русского текста DOS), 1251
(кодировка русского текста Windows), 65001
(UTF-8).

Иногда кракозябры можно убрать, если выбрать в свойствах окна cmd.exe шрифт Lucida Console (по умолчанию там стоит “Точечные шрифты”).

1
. Универсальный декодер – конвертер кириллицы
.

Введение

Консольные приложения до сих пор остаются наиболее востребованным видом приложений, большинство разработчиков оттачивают архитектуру и бизнес-логику именно в консоли. При этом они нередко сталкиваются с проблемой локализации – русский текст, который вполне адекватно отражается в исходном файле, при выводе на консоль приобретает вид т.н. “кракозябр”.

В целом, локализация консоли Windows при наличии соответствующего языкового пакета не представляется сложной. Тем не менее, полное и однозначное решение этой проблемы, в сущности, до сих пор не найдено. Причина этого, главным образом, кроется в самой природе консоли, которая, являясь компонентом системы, реализованным статическим классом System. Console, предоставляет свои методы приложению через системные программы-оболочки, такие как командная строка или командный процессор (cmd.exe), PowerShell, Terminal и другие.

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

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

I need to convert a text file to UTF-8 format via Windows command prompt. This needs to be done on another machine and I do not have rights to install software on that machine. I need something like:

 c:\notepad source-file target-file --encoding option 

Is there a Windows command prompt utility which can do it?

Kamil Maciorowski's user avatar

asked Jan 5, 2017 at 13:58

user1107888's user avatar

I need to convert a text file to utf-8 format via windows command prompt

You can easily do this with PowerShell:

 Get-Content .\test.txt | Set-Content -Encoding utf8 test-utf8.txt 

Further Reading

answered Jan 5, 2017 at 14:38

DavidPostill's user avatar

77 gold badges
350 silver badges
392 bronze badges

Use iconv
from GNUWin32 pack. It is much faster, especially if your files are about or more than 1 Gb.

 "C:\Program Files (x86)\GnuWin32\bin\iconv.exe" -f cp1251 -t utf-8 source.txt > result.txt 

Kamil Maciorowski's user avatar

answered Feb 21, 2018 at 15:09

Raul N-k's user avatar

Raul N-k

1 silver badge
1 bronze badge

Here is for each convert *.text file to *.sql file:

 foreach ($file in get-ChildItem *.txt) { Echo $file.name Get-Content $file | Set-Content -Encoding utf8 ("$file.name" +".sql") } 

answered May 20, 2019 at 10:20

nobjta_9x_tq's user avatar

 powershell -command "Get-Content .\test.txt" > test-utf8.txt 

It turns out that piping the output to a file from the command prompt saves as utf-8.

answered Sep 30, 2020 at 20:49

Gord Hooker's user avatar

POWERSHELL: # Assumes Windows PowerShell, use -Encoding utf8BOM with PowerShell Core. For multiple files:

 $files = Get-ChildItem c:\Folder1\ -Filter *.txt
foreach ($file in $files) { Get-Content $file.FullName | Set-Content "E:\Temp\Destination\$($file.Name)" -Encoding utf8BOM
} 

OR, SECOND SOLUTION (for multiple files):

 get-item C:\Folder1*.* | foreach-object {get-content -Encoding utf8BOM $_ | out-file ("C:\Folder1" + $_.Name) -encoding default} 

OR, THE THIRD SOLUTION: (only for 2 files)

 $a = "C:/Folder1/TEST_ro.txt" $b = "C:/Folder1/TEST_ro-2.txt" (Get-Content -path $a) | Set-Content -Encoding UTF8BOM -Path $b 

answered Aug 1, 2022 at 14:19

:/>  Переключение браузеров без потери данных — импорт в Chrome, Edge и другие

Just Me's user avatar

Just Me

1 gold badge
16 silver badges
37 bronze badges

For those who want to batch convert several files (e.g.: all *.txt
files in folder and sub-folders):

 dir *.txt -Recurse | foreach { # May remove the line below if you are confident Copy-Item $_ $_.bkp # Note that since we are reading and saving to the same file, # we need to enclose the command in parenthesis so it fully executes # (reading all content and closing the file) before proceeding (Get-Content $_) | Set-Content -Encoding utf8 $_
} 

answered Apr 12 at 13:46

J.Hudler's user avatar

Файл должен выводиться в utf-8, а в консоли – 866, в итоге в браузере отображаются ромбы.

После команды chcp 65001 ничего не поменялось.

Но у меня в CodePage таких файлов нет. Есть типы REG. SZ по умолчанию и 4 файла с номерами 932 936 949 950

Вариант постоянно изменять в консоли chcp не подходит, но и не работает. Lucida console подключен в консоли. Cygwin64 Terminal и Gitbash не запускает python server

Какие-то ещё есть варианты?

 # coding: utf-8
from horoscope import generate_prophecies
from datetime import datetime as dt
def generate_page(head, body): page = f"<html>{head}{body}</html>" return page
def generate_head(title): head = f"""<head> <meta charset='utf-8'> <title>{title}</title> </head> """ return head
def generate_body(header, paragraphs): body = f"<h1>{header}</h1>" for p in paragraphs: body = body + f"<p>{p}</p>" return f"<body>{body}</body>"
def save_page(title, header, paragraphs, output="index.html"): fp = open(output, "w") today = dt.now().date() page = generate_page( head=generate_head(title), body=generate_body(header=header, paragraphs=paragraphs) ) print(page, file=fp) fp.close()
#####################
today = dt.now().date()
save_page( title="Гороскоп на сегодня", header="Что день " + str(today) + " готовит", paragraphs=generate_prophecies(),
) 
 # coding: utf-8
from horoscope import generate_prophecies
from datetime import datetime as dt
def generate_page(head, body): page = f"<html>{head}{body}</html>" return page
def generate_head(title): head = f"""<head> <meta charset='utf-8'> <title>{title}</title> </head> """ return head
def generate_body(header, paragraphs): body = f"<h1>{header}</h1>" for p in paragraphs: body = body + f"<p>{p}</p>" return f"<body>{body}</body>"
def save_page(title, header, paragraphs, output="index.html"): fp = open(output, "w") today = dt.now().date() page = generate_page( head=generate_head(title), body=generate_body(header=header, paragraphs=paragraphs) ) print(page, file=fp) fp.close()
#####################
today = dt.now().date()
save_page( title="Гороскоп на сегодня", header="Что день " + str(today) + " готовит", paragraphs=generate_prophecies(),
) 

При запуске кода (python generate_all.py из командной строки или Ctrl+B в саблайме) в этой же папке генерируется файл index.html, и, если поднять сервер в этой же директории (python -m http.server) из консоли win, то в браузере ромбы.

Currently I’m running Windows 7 x64 and usually I want all console tools to work with UTF-8 rather than with default code page 850.

Running chcp 65001
in the command prompt prior to use of any tools helps but is there any way to set is as default code page?

Changing HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP
value to 65001
appear to make the system unable to boot in my case.

Community's user avatar

спросил 12 апр 2011 в 10:42

Regent's user avatar

  1. Пуск -> Выполнить -> regedit
  2. Перейти к [HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun]
  3. Измените значение на @chcp 65001>nul

Если Autorun
нет, можно добавить New String

Nabi K.A.Z.'s user avatar

1 золотой значок
6 серебряных значков
10 бронзовых знаков

ответил 12 апр 2011 в 12:22

Nils Magne Lunde's user avatar

Нильс Магне Лунде
Нильс Магне Лунде

1 золотой значок
17 серебряных значков
14 бронзовых знаков

Таким образом, это относится ко всем приложениям, даже к тем, которые я не запускаю из командной строки!

(Что было необходимо для меня, так как я пытался редактировать код Agda из Atom.)

Windows screenshot - Region Settings - UTF-8

Bob Stein's user avatar

1 золотой значок
16 серебряных значков
23 бронзовых знака

ответил 11 мая 2019 в 14:44

Isti115's user avatar

10 серебряных значков
11 бронзовых знаков

Лично я не люблю менять реестр. Это может вызвать много проблем. Я создал командный файл:

 @ECHO OFF
REM change CHCP to UTF-8
CHCP 65001
CLS 

Я сохранил в C:\Windows\System32
как switch.bat
и создал ссылку для cmd.exe
на рабочем столе.

В свойствах ярлыка cmd изменен пункт назначения на: C:\Windows\System32\cmd.exe /k switch

Вуаля, когда мне нужно ввести UTF-8, я использую эту ссылку.

Matthieu's user avatar

ответил 7 декабря 2013 в 15:36

juca's user avatar

5 серебряных значков
2 бронзовых знака

Редактировать реестр:

 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"OEMCP"="65001" 

Затем перезапустите. С этим исправлением, если вы используете шрифт Consolas, он блокируется.
PowerShell в небольшой размер шрифта. cmd.exe
все еще работает нормально. Как обходной путь,
вы можете использовать консоль Lucida, или я переключился на Cascadia Mono:

ответил 13 июн 2015 в 20:39

Zombo's user avatar

Это можно сделать, создав профиль PowerShell и добавив в него команду «chcp 65001 >$null»:

 PS> Set-ExecutionPolicy RemoteSigned
PS> New-Item -Path $Profile -ItemType file -Force
PS> notepad $Profile 

Это не требует редактирования реестра и, в отличие от редактирования ярлыка, будет работать, если PowerShell запущен в определенной папке с помощью контекстного меню проводника Windows.

ответил 3 сен 2017 в 20:56

Freon Sandoz's user avatar

  1. Щелкните правой кнопкой мыши значок Powershell в меню «Пуск» и выберите «Дополнительно» > «Открыть расположение файла».
  2. Щелкните правой кнопкой мыши ярлык Powershell и выберите «Свойства».
  3. Добавьте следующее в конец командной строки «Цель»: -NoExit -Command "chcp 1252"

Будь счастлив.
Не возитесь с реестром Windows, если у вас нет другого выбора.

ответил 2 ноя 2016 в 21:11

JColares's user avatar

1 серебряный значок
1 бронзовый значок

Открытие в Powershell через проводник у меня по-прежнему не работало, хотя я пытался включить эту бета-функцию Unicode в языковых настройках.

Однако я только что обнаружил, что это сработало.

 [HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe]
"CodePage"=dword:0000fde9  

Manually changing the

ответил 15 фев 2021 в 11:09

Daniel Cheung's user avatar

Если вы используете ConEmu
затем:

  1. Откройте Настройки в верхнем правом меню
  2. Перейдите в Startup -> Environment
  3. Добавить chcp 65001
    на новой линии.
  4. Нажмите “Сохранить настройки”.
  5. Закройте ConEmu и снова откройте его
:/>  Что делать если вместо текста иероглифы (в Word, браузере или текстовом документе)?

enter image description here

ответил 4 мая 2020 в 1:22

Ryan Shillington's user avatar

Вместо изменения реестра вы можете вместо этого создать %HOMEPATH%\init.cmd
.

Mine reads:

 @ECHO OFF
CHCP 65001 > nul 

RockPaperLz- Mask it or Casket's user avatar

answered Jan 21 at 9:39

user333869's user avatar

1 silver badge
6 bronze badges

Конфликт кодировок

Полностью локализованная консоль в идеале должна поддерживать все мыслимые и немыслимые кодировки приложений, включая свои собственные команды и команды Windows, меняя “на лету” кодовые страницы потоков ввода и вывода. Задача нетривиальная, а иногда и невозможная – кодовые страницы DOS (CP437, CP866) плохо совмещаются с кодовыми страницами Windows и Unicode.

История кодировок здесь: О кодировках и кодовых страницах / Хабр (habr.com)

Исторически кодовой страницей Windows является CP1251 (Windows-1251, ANSI, Windows-Cyr), уверенно вытесняемая 8-битной кодировкой Юникода CP65001 (UTF-8, Unicode Transformation Format), в которой выполняется большинство современных приложений, особенно кроссплатформенных. Между тем, в целях совместимости с устаревшими файловыми системами, именно в консоли Windows сохраняет базовые кодировки DOS – CP437 (DOSLatinUS, OEM) и русифицированную CP866 (AltDOS, OEM).

Совет 1.
Выполнять разработку текстовых файлов (программных кодов, текстовых данных и др.) исключительно в кодировке UTF-8. Мир любит Юникод, а кроссплатформенность без него вообще невозможна.

Совет 2.
Периодически проверять кодировку, например в текстовом редакторе Notepad++. Visual Studio может сбивать кодировку, особенно при редактировании за пределами VS.

Поскольку в консоли постоянно происходит передача управления от приложений к собственно командному процессору и обратно, регулярно возникает “конфликт кодировок”, наглядно иллюстрируемый таблица 1 и 2, сформированных следующим образом:

Команды и код приложения под катом

код тестового приложения:

 using System;
using ova.common.logging.LogConsole;
using Microsoft.Extensions.Logging;
using ova.common.logging.LogConsole.Colors;
namespace LoggingConsole.Test
{ partial class Program { static void Main2(string[] args) { ColorLevels.ColorsDictionaryCreate(); Console.WriteLine("Hello World! Привет, мир!"); //вывод строки приветствия на двух языках LogConsole.Write("Лог из стартового проекта", LogLevel.Information); Console.WriteLine($"8. Active codepage: input {Console.InputEncoding.CodePage}, output {Console.OutputEncoding.CodePage}"); Console.ReadKey(); } }
} 

Командную часть задания все консоли локализовали практически без сбоев во всех кодировках, за исключением: в WPS
неверно отображена русскоязычная часть команды во всех кодировках.

Табл. 1. Результат выполнения команды консоли Echo ffffff фффффф
Табл. 1. Результат выполнения команды консоли Echo ffffff фффффф

Вывод тестового приложения локализован лишь в 50% испытаний, как показано в табл.2.

Табл. 2. Результат запуска приложения LoggingConsole.Test
Табл. 2. Результат запуска приложения LoggingConsole. Test

По умолчанию Windows устанавливает для консоли кодовые страницы DOS. Чаще всего CP437, иногда CP866. Актуальные версии командной строки cmd.exe способны локализовать приложения на основе русифицированной кодовой страницы 866, но не 437, отсюда и изначальный конфликт кодировок консоли и приложения. Поэтому

Совет 4.
Перед запуском приложения необходимо проверить кодовую страницу консоли командой CHCP и ей же изменить кодировку на совместимую – 866, 1251, 65001.

Совет 5.
Можно установить кодовую страницу консоли по умолчанию
. Кратко: в разделе реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor добавить или изменить значение параметра Autorun на: chcp <номер кодовой страницы>. Очень подробно здесь: Изменить кодовую страницу консоли Windows по умолчанию на UTF-8 (qastack.ru)
, оригинал на английском здесь: Change default code page of Windows console to UTF-8
.

Локализация отладочной консоли Visual Studio

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

На самом деле, правильнее говорить о локализации приложения в консоли – это важное уточнение. Microsoft по этому поводу высказывается недвусмысленно: “Programs that you start after you assign a new code page use the new code page. However, programs (except Cmd.exe) that you started before assigning the new code page will continue to use the original code page”. Иными словами, консоль можно локализовать когда угодно и как угодно, но приложение будет локализовано в момент стабилизации взаимодействия с консолью в соответствии с текущей локализацией консоли, и эта локализация сохранится до завершения работы приложения. В связи с этим возникает вопрос – в какой момент окончательно устанавливается связь консоли и приложения?

Важно!
Приложение окончательно стабилизирует взаимодействие с консолью в момент начала ввода-вывода в консоль, благодаря чему и появляется возможность программного управления локализацией приложения в консоли

– до первого оператора ввода-вывода.

Ниже приведен пример вывода тестового приложения в консоль, иллюстрирующий изложенное. Метод Write получает номера текущих страниц, устанавливает новые кодовые страницы вводного и выводного потоков, выполняет чтение с консоли и записывает выводную строку, содержащий русский текст, в том числе считанный с консоли, обратно в консоль. Операция повторяется несколько раз для всех основных кодовых страниц, упомянутых ранее.

 F:\LoggingConsole.Test\bin\Release\net5.0>chcp
Active code page: 1251
F:\LoggingConsole.Test\bin\Release\net5.0>loggingconsole.test
Codepages: current 1251:1251, setted 437:437, ΓΓεΣΦ∞ 5 ±Φ∞ΓεδεΓ ∩ε-≡≤±±ΩΦ: Θ÷≤Ωσ=Θ÷≤Ωσ
Codepages: current 437:437, setted 65001:65001, 5 -: =
Codepages: current 65001:65001, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå
Codepages: current 1252:1252, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцуке
Codepages: current 1251:1251, setted 866:866, ттюфшь 5 ёшьтюыют яю-Ёєёёъш: щЎєъх=щЎєъх
Codepages: current 866:866, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцуке
Codepages: current 1251:1251, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå
F:\LoggingConsole.Test\bin\Release\net5.0>chcp
Active code page: 1252 
  • приложение запущено в консоли с кодовыми страницами 1251 (строка 2);

  • приложение меняет кодовые страницы консоли (current, setted);

  • приложение остановлено в консоли с кодовыми страницами 1252 (строка 11, setted);

  • по окончании работы приложения изменения консоли сохраняются (строка 14 – Active codepage 1252);

  • Приложение адекватно локализовано только в случае совпадения текущих кодовых страниц консоли (setted 1251:1251) с начальными кодовыми страницами (строки 8 и 10).

Код тестового приложения под катом
 using System;
using System.Runtime.InteropServices;
namespace LoggingConsole.Test
{ partial class Program { [DllImport("kernel32.dll")] static extern uint GetConsoleCP(); [DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum); [DllImport("kernel32.dll")] static extern uint GetConsoleOutputCP(); [DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum); static void Main(string[] args) { Write(437); Write(65001); Write(1252); Write(1251); Write(866); Write(1251); Write(1252); } static internal void Write(uint WantedIn, uint WantedOut) { uint CurrentIn = GetConsoleCP(); uint CurrentOut = GetConsoleOutputCP(); Console.Write($"current {CurrentIn}:{CurrentOut} - текущая кодировка, "); /*wanted {WantedIn}:{WantedOut},*/ SetConsoleCP(WantedIn); SetConsoleOutputCP(WantedOut); Console.Write($"setted {GetConsoleCP()}:{GetConsoleOutputCP()} - новая кодировка, "); Console.Write($"вводим 3 символа по-русски: "); string str = "" + Console.ReadKey().KeyChar.ToString(); str += Console.ReadKey().KeyChar.ToString(); str += Console.ReadKey().KeyChar.ToString(); Console.WriteLine($"={str}"); } static internal void Write(uint ChangeTo) { Write(ChangeTo, ChangeTo); } }
} 

Совет 7.
Обязательный и повторный! Функции SetConsoleCP должны размещаться в коде до первого оператора ввода-вывода

в консоль.

Виды консолей

В общем случае функции консоли таковы:

  • управление операционной системой и системным окружением приложений на основе применения стандартных системных устройств ввода-вывода (экран и клавиатура), использования команд операционной системы и/или собственно консоли;

  • запуск приложений и обеспечение их доступа к стандартным потокам ввода-вывода системы, также с помощью стандартных системных устройств ввода-вывода.

:/>  Что делать, если Windows не выходит из спящего режима

Основная консоль Windows – командная строка или иначе командный процессор ( CMD
). Большие возможности предоставляют оболочки PowerShell ( PS
), Windows PowerShell ( WPS
) и Terminal. По умолчанию Windows устанавливает Windows Power Shell мажорной версией до 5, однако предлагает перейти на новую версию – 7-ку, имеющую принципиальное отличие (вероятно, начинающееся с 6-ки) – кроссплатформенность. Terminal – также отдельно уставливаемое приложение, по сути интегратор всех ранее установленных оболочек PowerShell и командной строки.

Отдельным видом консоли можно считать консоль отладки Visual Studio ( CMD-D
).

CHCP – просмотр или изменение кодовой страницы в командной строке Windows.

Команда CHCP
используется для просмотра или изменения текущей кодовой страницы в окне командной строки Windows. Кодовая страница (Code Page или сокращенно CP) определяет соответствие между двоичным кодом и соответствующим ему символом, отображаемом на экране. Для кодирования текстов на русском языке (то есть букв кириллицы) наиболее широко применяются следующие кодовые страницы:

– Windows-1251, она же Microsoft code page 1251 (CP1251) в операционных системах семейства Windows;

– Кодовая страница CP866, она же IBM code page 866 — в операционных системах семейства DOS, а также в приложениях командной строки Microsoft Windows;

– Кодовая страница CP65001, она же Unicode, UTF-8 — в современных операционных системах семейства Microsoft Windows;

Стандартно, в приложениях командной строки, используется кодовая страница 866
, что соответствует DOS-кодировке. Окно приложения CMD. EXE
запускается с установленной кодовой страницей 866
. Изменение кодовой страницы действует только по отношению к текущему сеансу CMD.

Примеры использования команды CHCP:

chcp
– отобразить текущую кодовую страницу.

chcp 1251
– установить кодовую страницу, соответствующую Windows-кодировке.

chcp 866
– установить кодовую страницу, соответствующую DOS-кодировке.

При создании командных файлов, необходимо учитывать то обстоятельство, что текст на русском языке должен быть представлен в DOS-кодировке.

Некоторые приложения командной строки Windows 7 и более поздних версий выводят текст в кодировке Unicode, что требует установки соответствующей кодовой страницы командой chcp 65001


Весь список команд CMD Windows

Стратегия локализации приложения в консоли

  1. Удалить приложение PowerShell (если установлено), сохранив Windows PowerShell;

  2. Установить в качестве кодовую страницу консоли по умолчанию CP65001 (utf-8 Unicode) или CP1251 (Windows-1251-Cyr), см. совет 5
    ;

  3. Разработку приложений выполнять в кодировке utf-8 Unicode;

  4. Контролировать кодировку файлов исходных кодов, текстовых файлов данных, например с помощью Notepad++;

  5. Реализовать программное управление локализацией приложения в консоли, пример ниже под катом:

Пример программной установки кодовой страницы и локализации приложения в консоли
 using System;
using System.Runtime.InteropServices;
namespace LoggingConsole.Test
{ partial class Program {	static void Main(string[] args) {	[DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);	[DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum); SetConsoleCP(65001); //установка кодовой страницы utf-8 (Unicode) для вводного потока SetConsoleOutputCP(65001); //установка кодовой страницы utf-8 (Unicode) для выводного потока Console.WriteLine($"Hello, World!"); } }
} 

Проблемы консолей Visual Studio

В Visual Studio имеется возможность подключения консолей, по умолчанию подключены командная строка для разработчика и Windows PowerShell для разработчика. К достоинствам можно отнести возможности определения собственных параметров консоли, отдельных от общесистемных, а также запуск консоли непосредственно в директории разработки. В остальном – это обычные стандартные консоли Windows, включая, как показано ранее, установленную кодовую страницу по умолчанию.

Отдельной опцией Visual Studio является встроенная односеансная консоль отладки, которая перехватывает команду Visual Studio на запуск приложения, запускается сама, ожидает компиляцию приложения, запускает его и отдает ему управление. Таким образом, отладочная консоль в течение всего рабочего сеанса находится под управлением приложения и возможность использования команд Windows или самой консоли, включая команду CHCP, не предусмотрена. Более того, отладочная консоль не воспринимает кодовую страницу по умолчанию, определенную в реестре, и всегда запускается в кодировке 437 или 866.

Совет 6.
Тестирование приложения целесообразно выполнять во внешних консолях, более дружелюбных к локализации.

Анализ проблем консолей был бы не полон без ответа на вопрос – можно ли запустить консольное приложение без консоли? Можно – любой файл “.exe” запустится двойным кликом, и даже откроется окно приложения. Однако консольное приложение, по крайней мере однопоточное, по двойному клику запустится, но консольный режим не поддержит
– все консольные вводы-выводы будут проигнорированы, и приложение завершится