Какую кодировку / кодовую страницу использует 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 .

Рекомендации


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 При условии, что вы восприняли взлом реестра в моем «коротком ответе».

Другие вопросы по тегам