Como posso saber qual codificação um nome de arquivo está usando?

1

Eu 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 dizer qual codificação é usada nos nomes dos arquivos?

Uma das páginas de código? (Eu tentei as páginas de códigos cirílicos comuns 866 e 1251 usando o comando chcp sem sorte). Unicode (eu tentei 65001 sem sorte)? Algo mais?

Eu não me importo particularmente com o método da 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.

    
por DVK 19.07.2014 / 22:48

1 resposta

2

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.

    
por 19.07.2014 / 23:30