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

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

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

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

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

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

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

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

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

решение1

Кодировка имени файла определяется файловой системой. NTFS использует UTF-16. Но это не имеет значения.

Когда вы dirв командной строке, он не просто копирует байты вслепую. Сначала он должен вызвать соответствующую функцию ОС, чтобы просмотреть каталог, а затем вывести полученные данные файла на консоль.

При cmdвызове системной функции для получения списка каталогов она уже ожидает, что он будет возвращен в предпочитаемой кодировке (которая не обязательно является выбранной вами кодировкой — об этом позже). Ей все равно, какая кодировка используется внутри FS, поскольку ОС предоставляет дополнительный уровень абстракции для упрощения вещей. FS может использовать любую кодировку, которую вы можете себе представить, но пока ОС ее поддерживает, она cmdбудет получать имена файлов в своей предпочитаемой кодировке, а не в кодировке FS.

«Предпочтительная кодировка», о которой я упоминал, — это либо ANSI с примененной кодовой страницей, либо Unicode. ANSI использовалась как кодировка по умолчанию до Windows 2000. Windows 2000 и более новые версии используют Unicode по умолчанию, но все еще могут запускать программы ANSI.

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

cmdподдерживает Unicode, поэтому он будет получать имена файлов уже в Unicode.

Как вы уже поняли, виновником был шрифт по умолчанию. Эта проблема упоминается наСтраница Technet на chcp:

Только кодовая страница производителя оригинального оборудования (OEM), установленная с Windows XP, отображается правильно в окне командной строки, использующем шрифты Raster. Другие кодовые страницы отображаются правильно в полноэкранном режиме или окнах командной строки, использующих шрифты TrueType.

Связанный контент