Tenho alguns arquivos com nomes russos (cirílicos).
Quando os abro no Windows Explorer, os nomes são exibidos corretamente.
Quando eu os listo no shell de comando (cmd), eles são exibidos como "?????" personagem.
Existe uma maneira de saber qual codificação é usada nos nomes dos arquivos?
Uma das páginas de código? (Tentei as páginas de código cirílico comuns 866 e 1251 usando chcp
o comando sem sorte). Unicode (tentei 65001 sem sorte)? Algo mais?
Eu particularmente não me importo com o método de resposta (todos os itens a seguir são aceitáveis: programa freeware, script Perl, script Powershell, página da web que me faz carregar o arquivo).
Sistema: Windows XP SP3.
Responder1
A codificação do nome do arquivo é definida pelo sistema de arquivos. NTFS usa UTF-16. Isso não importa, no entanto.
Quando você dir
está na linha de comando, ele não copia bytes cegamente. Primeiro, ele precisa chamar a função apropriada do sistema operacional para listar o diretório e, em seguida, imprimir os detalhes do arquivo recebido no console.
Quando cmd
chama a função do sistema para recuperar a listagem de diretórios, ele já espera que ela seja retornada na codificação preferida (que não é necessariamente a codificação de sua escolha - falaremos mais sobre isso mais tarde). Não importa qual codificação é usada internamente no FS, porque o sistema operacional fornece uma camada de abstração adicional para simplificar as coisas. O FS pode usar qualquer codificação que você possa imaginar, mas desde que o sistema operacional suporte, cmd
receberá nomes de arquivos em sua codificação preferida, não na codificação do FS.
A "codificação preferencial" que mencionei é ANSI com página de código aplicada ou Unicode. ANSI era usado como codificação padrão antes do Windows 2000. O Windows 2000 e versões mais recentes usam Unicode por padrão, mas ainda podem executar programas ANSI.
Para programas Unicode, a página de código é completamente ignorada e chcp
não tem efeito. É usado apenas para programas ANSI mais antigos que dependem da configuração adequada da página de código. Isso não importa mais para o Unicode, porque ele é bem definido e suporta tudo o que qualquer programa razoável poderia produzir.
cmd
suporta Unicode, portanto receberá nomes de arquivos já em Unicode.
Como você já descobriu, o culpado foi a fonte padrão. Este problema é mencionado emPágina Technet no chcp:
Somente a página de código do fabricante original do equipamento (OEM) instalada com o Windows XP aparece corretamente em uma janela de prompt de comando que usa fontes Raster. Outras páginas de código aparecem corretamente no modo de tela inteira ou em janelas de prompt de comando que usam fontes TrueType.