Кодировка имени файла определяется файловой системой. NTFS использует UTF-16. Это не имеет значения, однако.
Когда вы dir
в командной строке, он не просто слепо копирует байты. Сначала нужно вызвать соответствующую функцию ОС, чтобы вывести список каталогов, а затем распечатать полученные данные файла на консоль.
Когда cmd
вызывает системную функцию для получения списка каталогов, он уже ожидает, что он будет возвращен в предпочтительной кодировке (что не обязательно является вашей выбранной кодировкой - подробнее об этом позже). Неважно, какая кодировка используется внутри ФС, потому что ОС предоставляет дополнительный уровень абстракции для упрощения. FS может использовать любую кодировку, которую вы можете себе представить, но пока ОС поддерживает ее, cmd
будет получать имена файлов в своей предпочтительной кодировке, а не кодировку FS.
Упомянутая мной "предпочтительная кодировка" - это либо ANSI с примененной кодовой страницей, либо Unicode. ANSI использовалась в качестве кодировки по умолчанию до Windows 2000. Windows 2000 и более новые версии используют Unicode по умолчанию, но все же могут запускать программы ANSI.
Для программ Unicode кодовая страница полностью игнорируется, и chcp
имеет никакого эффекта. Он используется только для старых программ ANSI, которые используют правильную кодовую страницу. Для Unicode это больше не имеет значения, потому что оно четко определено и поддерживает все, что может выводить любая разумная программа.
cmd
поддерживает Unicode, поэтому он будет получать имена файлов уже в Unicode.
Как вы уже узнали, виновником был шрифт по умолчанию. Эта проблема упоминается на странице Technet на chcp:
В окне командной строки, в котором используются растровые шрифты, правильно отображается только кодовая страница изготовителя оборудования (OEM), установленная с Windows XP. Другие кодовые страницы отображаются правильно в полноэкранном режиме или окнах командной строки, которые используют шрифты TrueType.