Какую кодировку / кодовую страницу использует cmd.exe?
Когда я открываю cmd.exe в Windows, какую кодировку он использует?
Как я могу проверить, какая кодировка используется в настоящее время? Зависит ли это от моих региональных настроек или есть какие-то переменные среды для проверки?
Что происходит при вводе файла с определенной кодировкой? Иногда я получаю искаженные символы (используется неправильная кодировка), а иногда это работает. Однако я ничему не доверяю, пока не знаю, что происходит. Кто-нибудь может объяснить?
8 ответов
Да, это расстраивает - иногда type
и другие программы печатают бессмысленно, а иногда нет.
Прежде всего, символы Unicode будут отображаться только в том случае, если текущий шрифт консоли содержит символы. Поэтому используйте шрифт TrueType, например Lucida Console, вместо стандартного шрифта Raster.
Но если в консольном шрифте нет символа, который вы пытаетесь отобразить, вместо тарабарщины вы увидите вопросительные знаки. Когда вы получаете бред, происходит больше, чем просто настройки шрифта.
Когда программы используют стандартные функции ввода-вывода C-библиотеки, такие как printf
, выходная кодировка программы должна совпадать с выходной кодировкой консоли, иначе вы получите бред. chcp
показывает и устанавливает текущую кодовую страницу. Весь вывод, использующий стандартные функции ввода-вывода библиотеки C, обрабатывается так, как если бы он находился в кодовой странице, отображаемой chcp
,
Сопоставление выходной кодировки программы с выходной кодировкой консоли можно выполнить двумя различными способами:
Программа может получить текущую кодовую страницу консоли, используя
chcp
или жеGetConsoleOutputCP
и настроить себя для вывода в этой кодировке, илиВы или программа можете установить текущую кодовую страницу консоли, используя
chcp
или жеSetConsoleOutputCP
соответствовать выходной кодировке программы по умолчанию.
Однако программы, использующие Win32 API, могут записывать строки UTF-16LE непосредственно в консоль с помощью WriteConsoleW
, Это единственный способ получить правильный вывод без установки кодовых страниц. И даже при использовании этой функции, если строка не находится в кодировке UTF-16LE для начала, программа Win32 должна передать правильную кодовую страницу MultiByteToWideChar
, Также, WriteConsoleW
не будет работать, если вывод программы перенаправлен; в этом случае нужно больше возиться.
type
работает некоторое время, потому что он проверяет начало каждого файла для метки порядка байтов UTF-16LE, то есть байтов 0xFF 0xFE
, Если он находит такую метку, он отображает символы Unicode в файле, используя WriteConsoleW
независимо от текущей кодовой страницы. Но когда type
использование любого файла без спецификации UTF-16LE или использование не-ASCII символов с любой командой, которая не вызывает WriteConsoleW
- вам нужно настроить кодовую страницу консоли и кодировку вывода программы так, чтобы они соответствовали друг другу.
Как мы можем это выяснить?
Вот тестовый файл, содержащий символы Unicode:
ASCII abcde xyz
German äöü ÄÖÜ ß
Polish ąęźżńł
Russian абвгдеж эюя
CJK 你好
Вот Java-программа для распечатки тестового файла в куче разных кодировок Unicode. Это может быть на любом языке программирования; он печатает только символы ASCII или закодированные байты в stdout
,
import java.io.*;
public class Foo {
private static final String BOM = "\ufeff";
private static final String TEST_STRING
= "ASCII abcde xyz\n"
+ "German äöü ÄÖÜ ß\n"
+ "Polish ąęźżńł\n"
+ "Russian абвгдеж эюя\n"
+ "CJK 你好\n";
public static void main(String[] args)
throws Exception
{
String[] encodings = new String[] {
"UTF-8", "UTF-16LE", "UTF-16BE", "UTF-32LE", "UTF-32BE" };
for (String encoding: encodings) {
System.out.println("== " + encoding);
for (boolean writeBom: new Boolean[] {false, true}) {
System.out.println(writeBom ? "= bom" : "= no bom");
String output = (writeBom ? BOM : "") + TEST_STRING;
byte[] bytes = output.getBytes(encoding);
System.out.write(bytes);
FileOutputStream out = new FileOutputStream("uc-test-"
+ encoding + (writeBom ? "-bom.txt" : "-nobom.txt"));
out.write(bytes);
out.close();
}
}
}
}
Выход в кодовой странице по умолчанию? Общая фигня!
Z:\andrew\projects\sx\1259084>chcp
Active code page: 850
Z:\andrew\projects\sx\1259084>java Foo
== UTF-8
= no bom
ASCII abcde xyz
German ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish ąęźżńł
Russian ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK õ¢áÕÑ¢
= bom
´╗┐ASCII abcde xyz
German ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish ąęźżńł
Russian ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK õ¢áÕÑ¢
== UTF-16LE
= no bom
A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ♣☺↓☺z☺|☺D☺B☺
R u s s i a n 0♦1♦2♦3♦4♦5♦6♦ M♦N♦O♦
C J K `O}Y
= bom
■A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ♣☺↓☺z☺|☺D☺B☺
R u s s i a n 0♦1♦2♦3♦4♦5♦6♦ M♦N♦O♦
C J K `O}Y
== UTF-16BE
= no bom
A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ☺♣☺↓☺z☺|☺D☺B
R u s s i a n ♦0♦1♦2♦3♦4♦5♦6 ♦M♦N♦O
C J K O`Y}
= bom
■ A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ☺♣☺↓☺z☺|☺D☺B
R u s s i a n ♦0♦1♦2♦3♦4♦5♦6 ♦M♦N♦O
C J K O`Y}
== UTF-32LE
= no bom
A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ♣☺ ↓☺ z☺ |☺ D☺ B☺
R u s s i a n 0♦ 1♦ 2♦ 3♦ 4♦ 5♦ 6♦ M♦ N
♦ O♦
C J K `O }Y
= bom
■ A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ♣☺ ↓☺ z☺ |☺ D☺ B☺
R u s s i a n 0♦ 1♦ 2♦ 3♦ 4♦ 5♦ 6♦ M♦ N
♦ O♦
C J K `O }Y
== UTF-32BE
= no bom
A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ☺♣ ☺↓ ☺z ☺| ☺D ☺B
R u s s i a n ♦0 ♦1 ♦2 ♦3 ♦4 ♦5 ♦6 ♦M ♦N
♦O
C J K O` Y}
= bom
■ A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ☺♣ ☺↓ ☺z ☺| ☺D ☺B
R u s s i a n ♦0 ♦1 ♦2 ♦3 ♦4 ♦5 ♦6 ♦M ♦N
♦O
C J K O` Y}
Однако, что если мы type
файлы, которые были сохранены? Они содержат те же байты, которые были напечатаны на консоли.
Z:\andrew\projects\sx\1259084>type *.txt
uc-test-UTF-16BE-bom.txt
■ A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ☺♣☺↓☺z☺|☺D☺B
R u s s i a n ♦0♦1♦2♦3♦4♦5♦6 ♦M♦N♦O
C J K O`Y}
uc-test-UTF-16BE-nobom.txt
A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ☺♣☺↓☺z☺|☺D☺B
R u s s i a n ♦0♦1♦2♦3♦4♦5♦6 ♦M♦N♦O
C J K O`Y}
uc-test-UTF-16LE-bom.txt
ASCII abcde xyz
German äöü ÄÖÜ ß
Polish ąęźżńł
Russian абвгдеж эюя
CJK 你好
uc-test-UTF-16LE-nobom.txt
A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ♣☺↓☺z☺|☺D☺B☺
R u s s i a n 0♦1♦2♦3♦4♦5♦6♦ M♦N♦O♦
C J K `O}Y
uc-test-UTF-32BE-bom.txt
■ A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ☺♣ ☺↓ ☺z ☺| ☺D ☺B
R u s s i a n ♦0 ♦1 ♦2 ♦3 ♦4 ♦5 ♦6 ♦M ♦N
♦O
C J K O` Y}
uc-test-UTF-32BE-nobom.txt
A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ☺♣ ☺↓ ☺z ☺| ☺D ☺B
R u s s i a n ♦0 ♦1 ♦2 ♦3 ♦4 ♦5 ♦6 ♦M ♦N
♦O
C J K O` Y}
uc-test-UTF-32LE-bom.txt
A S C I I a b c d e x y z
G e r m a n ä ö ü Ä Ö Ü ß
P o l i s h ą ę ź ż ń ł
R u s s i a n а б в г д е ж э ю я
C J K 你 好
uc-test-UTF-32LE-nobom.txt
A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ♣☺ ↓☺ z☺ |☺ D☺ B☺
R u s s i a n 0♦ 1♦ 2♦ 3♦ 4♦ 5♦ 6♦ M♦ N
♦ O♦
C J K `O }Y
uc-test-UTF-8-bom.txt
´╗┐ASCII abcde xyz
German ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish ąęźżńł
Russian ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK õ¢áÕÑ¢
uc-test-UTF-8-nobom.txt
ASCII abcde xyz
German ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish ąęźżńł
Russian ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK õ¢áÕÑ¢
Единственное, что работает, это файл UTF-16LE с спецификацией, распечатанный на консоли через type
,
Если мы используем что-то кроме type
чтобы распечатать файл, мы получаем мусор:
Z:\andrew\projects\sx\1259084>copy uc-test-UTF-16LE-bom.txt CON
■A S C I I a b c d e x y z
G e r m a n õ ÷ ³ ─ Í ▄ ▀
P o l i s h ♣☺↓☺z☺|☺D☺B☺
R u s s i a n 0♦1♦2♦3♦4♦5♦6♦ M♦N♦O♦
C J K `O}Y
1 file(s) copied.
Из того что copy CON
не отображает Unicode правильно, мы можем сделать вывод, что type
Команда имеет логику для обнаружения спецификации UTF-16LE в начале файла и использования специальных API-интерфейсов Windows для ее печати.
Мы можем увидеть это, открыв cmd.exe
в отладчике, когда он идет к type
из файла:
После type
открывает файл, он проверяет спецификацию 0xFEFF
То есть байты 0xFF 0xFE
в порядке байтов - и если есть такая спецификация, type
устанавливает внутренний fOutputUnicode
флаг. Этот флаг проверяется позже, чтобы решить, стоит ли звонить WriteConsoleW
,
Но это единственный способ получить type
выводить Unicode, и только для файлов, которые имеют спецификации и находятся в UTF-16LE. Для всех других файлов, а также для программ, которые не имеют специального кода для обработки вывода на консоль, ваши файлы будут интерпретироваться в соответствии с текущей кодовой страницей и, скорее всего, будут отображаться как бред.
Вы можете подражать, как type
выводит Unicode на консоль в ваших собственных программах следующим образом:
#include <stdio.h>
#define UNICODE
#include <windows.h>
static LPCSTR lpcsTest =
"ASCII abcde xyz\n"
"German äöü ÄÖÜ ß\n"
"Polish ąęźżńł\n"
"Russian абвгдеж эюя\n"
"CJK 你好\n";
int main() {
int n;
wchar_t buf[1024];
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
n = MultiByteToWideChar(CP_UTF8, 0,
lpcsTest, strlen(lpcsTest),
buf, sizeof(buf));
WriteConsole(hConsole, buf, n, &n, NULL);
return 0;
}
Эта программа работает для печати Unicode на консоли Windows с использованием кодовой страницы по умолчанию.
Для примера Java-программы мы можем получить немного правильного вывода, установив кодовую страницу вручную, хотя выходные данные путаются странным образом:
Z:\andrew\projects\sx\1259084>chcp 65001
Active code page: 65001
Z:\andrew\projects\sx\1259084>java Foo
== UTF-8
= no bom
ASCII abcde xyz
German äöü ÄÖÜ ß
Polish ąęźżńł
Russian абвгдеж эюя
CJK 你好
ж эюя
CJK 你好
你好
好
�
= bom
ASCII abcde xyz
German äöü ÄÖÜ ß
Polish ąęźżńł
Russian абвгдеж эюя
CJK 你好
еж эюя
CJK 你好
你好
好
�
== UTF-16LE
= no bom
A S C I I a b c d e x y z
…
Однако, программа на C, которая устанавливает кодовую страницу Unicode UTF-8:
#include <stdio.h>
#include <windows.h>
int main() {
int c, n;
UINT oldCodePage;
char buf[1024];
oldCodePage = GetConsoleOutputCP();
if (!SetConsoleOutputCP(65001)) {
printf("error\n");
}
freopen("uc-test-UTF-8-nobom.txt", "rb", stdin);
n = fread(buf, sizeof(buf[0]), sizeof(buf), stdin);
fwrite(buf, sizeof(buf[0]), n, stdout);
SetConsoleOutputCP(oldCodePage);
return 0;
}
имеет правильный вывод:
Z:\andrew\projects\sx\1259084>.\test
ASCII abcde xyz
German äöü ÄÖÜ ß
Polish ąęźżńł
Russian абвгдеж эюя
CJK 你好
Мораль этой истории?
type
может печатать файлы UTF-16LE с спецификацией независимо от вашей текущей кодовой страницы- Программы Win32 могут быть запрограммированы для вывода Unicode на консоль, используя
WriteConsoleW
, - Другие программы, которые устанавливают кодовую страницу и соответственно корректируют свою выходную кодировку, могут печатать Unicode на консоли независимо от того, какой была кодовая страница при запуске программы.
- Для всего остального вам придется возиться с
chcp
и, вероятно, все еще получит странный вывод.
Тип
chcp
чтобы увидеть вашу текущую кодовую страницу (как уже сказал Dewfy).
использование
nlsinfo
чтобы увидеть все установленные кодовые страницы и узнать, что означает номер вашей кодовой страницы.
Для использования необходимо установить комплект ресурсов Windows Server 2003 (работает на Windows XP) nlsinfo
,
Чтобы ответить на ваш второй запрос повторно. Как работает кодирование, Джоэл Спольски написал отличную вводную статью по этому вопросу. Настоятельно рекомендуется.
Я долго расстраивался из-за проблем с кодовыми страницами Windows, а также из-за проблем переносимости и локализации программ на Си. В предыдущих постах подробно рассказывалось о проблемах, поэтому я не собираюсь ничего добавлять на этот счет.
Короче говоря, в конечном итоге я написал свой собственный уровень библиотеки совместимости UTF-8 поверх стандартной библиотеки языка C Visual Basic. По сути, эта библиотека гарантирует, что стандартная программа на C работает правильно, в любой кодовой странице, используя UTF-8 внутри.
Эта библиотека, которая называется MsvcLibX, доступна в открытом доступе по адресу https://github.com/JFLarvoire/SysToolsLib. Основные характеристики:
- Исходники C, закодированные в UTF-8, с использованием обычных строк char[] C и стандартных API-интерфейсов библиотеки C.
- На любой кодовой странице все внутри вашего кода обрабатывается как UTF-8, включая подпрограмму main() argv[], при этом стандартный ввод и вывод автоматически преобразуются в правильную кодовую страницу.
- Все функции файла stdio.h поддерживают имена путей UTF-8> 260 символов, фактически до 64 КБ.
- Те же источники могут успешно компилироваться и компоноваться в Windows с использованием библиотек Visual C++ и MsvcLibX и Visual C++, а также в Linux с использованием стандартной библиотеки C gcc и Linux, без необходимости в блоках #ifdef... #endif.
- Добавляет включаемые файлы, распространенные в Linux, но отсутствующие в Visual C++. Пример: unistd.h
- Добавляет недостающие функции, такие как функции ввода-вывода в каталогах, управления символическими ссылками и т. Д., Конечно, с поддержкой UTF-8:-).
Более подробная информация в MsvcLibX README на GitHub, в том числе о том, как собрать библиотеку и использовать ее в своих собственных программах.
Раздел выпуска в вышеупомянутом репозитории GitHub предоставляет несколько программ, использующих эту библиотеку MsvcLibX, которые покажут ее возможности. Пример: попробуйте мой инструмент which.exe с каталогами с не-ASCII-именами в PATH, поиск программ с не-ASCII-именами и изменение кодовых страниц.
Еще одним полезным инструментом является программа conv.exe. Эта программа может легко конвертировать поток данных из любой кодовой страницы в любую другую. По умолчанию вводится в кодовой странице Windows и выводится в текущей кодовой странице консоли. Это позволяет правильно просматривать данные, генерируемые приложениями Windows GUI (например, Notepad) в командной консоли, с помощью простой команды, такой как: type WINFILE.txt | conv
Эта библиотека MsvcLibX ни в коем случае не является полной, и мы приветствуем вклад в ее улучшение!
Команда CHCP показывает текущую кодовую страницу. Он состоит из трех цифр: 8xx и отличается от Windows 12xx. Поэтому, печатая текст на английском языке, вы не увидите никакой разницы, но расширенная кодовая страница (например, кириллица) будет напечатана неправильно.
Вы можете управлять кодовой страницей, просто создав файл %HOMEPATH%\init.cmd.
Мой говорит:
@ECHO OFF
CHCP 65001 > nul
В Java я использовал кодировку "IBM850" для записи файла. Это решило проблему.
1. Краткий ответ: по умолчанию установлено использование кодировки ANSI .
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ. Следование любым предложениям здесь осуществляется на ваш страх и риск.
Создайте и запустите файл с подходящим именем: 1
Windows Registry Editor Version 5.00
;; https://stackoverflow.com/a/75788701
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]
"Autorun"="C:\\Windows\\System32\\chcp.com 1252"
На случай, если позже вы передумаете – вотCMD-CodePage-1252-Restore.reg
файл :
Windows Registry Editor Version 5.00
;; https://stackoverflow.com/a/75788701
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]
"Autorun"=-
2. Длинный ответ – попытка ответить на все ваши вопросы.
Когда я открываю в Windows, какая кодировка используется?
– По умолчанию используется . На мой взгляд это ужасный выбор. Вместо этого я предлагаю использовать кодовую страницу ANSI
вашего языка .– Он совместим с кодировкой ANSI в собственном текстовом редакторе Microsoft.C:\WINDOWS\System32\notepad.exe
.
Для западноевропейских языков ANSI означает кодовую страницу 1252 или Windows-1252 (CP-1252).
Для других языковых групп я разместил таблицу в конце .
Как я могу проверить, какая кодировка используется в данный момент?
- БегатьC:\WINDOWS\System32\chcp.com
:
C:\>chcp
Active code page: 1252
Причина, по которой он реагирует1252
вместо437
в моем случае это то, что я намеренно установил значение 1252 по умолчанию. Как описано в моем «коротком» ответе выше.
Зависит ли это от моих региональных настроек или есть ли какие-либо переменные среды, которые нужно проверить?
- Ни один. Что важно в этом контексте, так это язык . Я попробовал следующее:
WinKey+ i > Время и язык > Язык > Предпочитаемые языки > Добавить язык . Я добавил Шведский (Швеция) , а затем убедился, что в Windows выбран язык отображения Шведский .
Наконец, я перезагрузил компьютер, открыл, набрал и нажал Enter. Ответ был. Таким образом, хотя язык отображения Windows меняет язык Windows, это, похоже, не влияет на используемую кодовую страницу. 2
Что происходит, когда вы вводите файл с определенной кодировкой?
Иногда у меня появляются искаженные символы (из-за неправильной кодировки), а иногда это работает.
- Да. Это именно то, чего вам следует ожидать. Например, у меня есть файл,Some-ANSI-chars.txt
который содержит шведские буквы и , закодированные с помощью кодовой страницы 1252, в кодировке ANSI .
Когда я открываю файл, шведские буквы печатаются правильно:
C:\stackexchange\stackoverflow\Char-encoding>type Some-ANSI-chars.txt
Sakta men säkert vinner basinkomst mark,
och det viktigaste just nu är att hålla ihop.
Но когда я делаю копию файла и его в UTF-8, для каждой шведской буквы (не ASCII) печатаются два искаженных символа:
C:\stackexchange\stackoverflow\Char-encoding>type Some-UTF-8-chars.txt
Sakta men säkert vinner basinkomst mark,
och det viktigaste just nu är att hålla ihop.
Как видите, два символа в кодировке UTF-8 используют по два байта каждый .
Команда декодируетå
иä
для отображения двух бессмысленных однобайтовых символов каждый, а именноÃ¥
иä
. Для меня это не проблема, я почти никогда неtype
содержимое моих текстовых файлов.
Единственное, что имеет значение, это то, что мой любимый текстовый редактор настроен на декодирование моих файлов в UTF-8.3
Однако я ничему не доверяю, пока не знаю, что происходит.
– Это мудро с твоей стороны. Это защитит вас (надеюсь) от попадания в ловушку использования кодировки UTF-8 в , виновником которой является кодовая страница 65001.
Причины не использовать кодировку UTF-8 в
- (2011) имеются серьезные ошибки реализации.
- Кодовая страница (2012 г.).
- (2016).
- (2016).
- (2017).
- (2017).
- (2019).
- Бета-версия: использование Unicode UTF-8 для поддержки языков по всему миру (2021).
Рассмотрите возможность использования MSYS2 в качестве альтернативной утилиты командной строки.
в стиле Linux, который по умолчанию предполагает, что ваши текстовые файлы имеют кодировку UTF-8.
Обратите внимание: хотя все символы UTF-8 отображаются правильно:
$ cat Some-UTF-8-chars.txt
Sakta men säkert vinner basinkomst mark,
och det viktigaste just nu är att hålla ihop.
символы ANSI (не ASCII) будут выводиться в виде вопросительных знаков:
$ cat Some-ANSI-chars.txt
Sakta men s�kert vinner basinkomst mark,
och det viktigaste just nu �r att h�lla ihop.
В заключение,cmd.exe
правильно выводит файлы в кодировке ANSI , 4
а терминал MSYS2 правильно выводит файлы в кодировке UTF-8 .
Рекомендации
- кодовая страница 437Кодовая страница 437 (IBM PC)
- этого ответаСообщение, содержащее таблицу кодировок ANSI для десяти различных языковых групп.
- конвертируюСообщение, объясняющее разницу между кодировкой в UTF-8 и преобразованием в UTF-8.
- В кодовой странице Windows65001Серьезные ошибки реализации в кодовой странице Windows65001.
- 65001… не поддерживаетсяКодовая страница 65001 не поддерживается.
- обеспечивает некоторое декодирование UTF-8, но оно очень элементарное и не обеспечивает правильного вводаобеспечивает некоторое декодирование UTF-8, но оно очень элементарное.
- Консоль Windows полна ошибок, когда в качестве кодировки установлена неподдерживаемая многобайтовая кодовая страница, например 65001Консоль Windows полна ошибок [для] кодовой страницы 65001.
- С кодовой страницей 65001 консоль во всех версиях Windows(даже новая консоль в Windows 10) не поддерживает ввод не в формате ASCIIКодовая страница 65001… не поддерживает ввод не в формате ASCII.
- очень опасно
chcp 65001
очень опасно - Не используйте , за исключением временного использования в пакетных сценарияхНе использовать
chcp.com 65001
- нарушило функциональность некоторых старых и дрянных программ, которые нормально работали на сервере 2019Бета: Юникод UTF-8 сломал… некоторые старые… программы…
- Если вам отчаянно нужен инструмент командной строки, который правильно выводит текст ваших файлов в кодировке UTF-8, я предлагаю вам загрузить и установить MSYS2МСИС2 | страница загрузки
- Некоторые-ANSI-chars.txt
- Some-UTF-8-chars.txt
1 _.reg
файл вдохновлен Пост, предлагающий добавить
этим ответом"Autorun"="chcp 1252>>nul"
в реестре . Я надеюсь, что вы знаете, как добиться того же самого в реестре вручную .
Целесообразно сначала проверить реестр, чтобы узнать, есть ли у вас уже значение REG_SZ по имени.
Взлом реестра не влияет на PowerShell.– Откройте PowerShell и запуститеchcp
. Ожидайте увидетьActive code page: 437
.
Конечно, я использую кодовую страницу 1252 в своем.bat
файлы тоже. В любом случае около 99% из них представляют собой чистые файлы ASCII.
2 Проводя этот эксперимент, я убедился, что нетAutorun
стоимость подHKLM\SOFTWARE\Microsoft\Command Processor
в реестре.
3 Если быть точным, у меня есть не менее трех «любимых» текстовых редакторов: Блокнот2 | страница загрузкиNotepad2 , Блокнот++ | страница загрузкиNotepad++ и Код Visual Studio | страница загрузкиVisual Studio Code .
Из этих трех код Visual Studio настроен на кодирование всех файлов с помощью UTF-8, а Notepad2 и Notepad++
автоматически определяют любую кодировку, которую редактор считает правильной.
4 При условии, что вы восприняли взлом реестра в моем «коротком ответе».