A codificação do nome do arquivo é definida pelo sistema de arquivos. O NTFS usa o UTF-16. Não importa, no entanto.
Quando você dir
na linha de comando, ele não apenas 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, ela já espera que ela seja retornada na codificação preferida (o que não é necessariamente sua codificação de escolha - mais sobre isso posteriormente). Não importa qual codificação é usada internamente no FS, porque o SO fornece 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 ofereça suporte, cmd
receberá nomes de arquivos em sua codificação preferida, não a codificação do FS.
A "codificação preferida" que eu mencionei é ANSI com página de códigos aplicada ou Unicode. O ANSI foi usado como codificação padrão antes do Windows 2000. O Windows 2000 e versões mais recentes usam o Unicode por padrão, mas ainda podem executar programas ANSI.
Para programas Unicode, a página de códigos é completamente ignorada e chcp
não tem efeito. Ele é usado apenas para programas ANSI mais antigos que dependem de uma página de códigos adequada definida. Não importa mais para o Unicode, porque ele é bem definido e suporta tudo que qualquer programa razoável puder gerar.
cmd
suporta Unicode, portanto, ele receberá nomes de arquivos já em Unicode.
Como você já descobriu, o culpado era a fonte padrão. Esse problema é mencionado na página do Technet no chcp :
Only the original equipment manufacturer (OEM) code page installed with Windows XP appears correctly in a command prompt window that uses Raster fonts. Other code pages appear correctly in full-screen mode or command prompt windows that use TrueType fonts.