1

У меня есть несколько файлов с русскими (кириллическими) именами.

Когда я открываю их в проводнике Windows, имена отображаются правильно.

Когда я перечисляю их в командной оболочке (cmd), они отображаются как «?????" персонаж.

Есть ли способ сказать, какая кодировка используется в именах файлов?

Одна из кодовых страниц? (Я попробовал обычные кириллические кодовые страницы 866 и 1251, используя команду chcp но безуспешно ). Юникод (пробовал 65001 не повезло)? Что-то другое?

Меня не особо волнует метод ответа (приемлемо все следующее: бесплатная программа, Perl-скрипт, Powershell-скрипт, веб-страница, которая заставляет меня загрузить файл).

Система: Windows XP SP3.

1 ответ1

2

Кодировка имени файла определяется файловой системой. 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .