J'ai des fichiers avec des noms russes (cyrilliques).
Lorsque je les ouvre dans l'Explorateur Windows, les noms s'affichent correctement.
Lorsque je les répertorie dans le shell de commande (cmd), ils s’affichent sous la forme "?????" personnage.
Existe-t-il un moyen de savoir quel encodage est utilisé dans les noms de fichiers?
Une des pages de code? (J'ai essayé les pages de codes cyrilliques communes 866 et 1251 en utilisant chcp
commande sans chance). Unicode (j'ai essayé pas de chance 65001)? Autre chose?
Je ne me soucie pas particulièrement de la méthode de réponse (tout ce qui suit est acceptable: programme gratuit, script Perl, script Powershell, page Web qui me permet de télécharger le fichier).
Système: Windows XP SP3.
Réponses:
Le codage du nom de fichier est défini par le système de fichiers. NTFS utilise UTF-16. Cela n'a pas d'importance, cependant.
Lorsque vous
dir
en ligne de commande, il ne fait pas que copier les octets à l’aveugle. Il doit d’abord appeler la fonction appropriée du système d’exploitation pour répertorier le répertoire, puis imprimer les détails du fichier reçu sur la console.Quand
cmd
appelle la fonction système pour récupérer une liste de répertoires, elle s'attend déjà à ce qu'elle soit renvoyée dans le codage préféré (ce qui n'est pas nécessairement le codage de votre choix - plus d'informations à ce sujet plus tard). Peu importe le type d’encodage utilisé en interne dans le système de fichiers, car le système d’exploitation fournit une couche d’abstraction supplémentaire pour simplifier les choses. FS peut utiliser n’importe quel codage que vous pouvez imaginer, mais tant que le système d’exploitation le supporte,cmd
recevra les noms de fichiers dans son codage préféré, pas celui de FS.Le "codage préféré" que j'ai mentionné est soit ANSI avec page de code appliquée, soit Unicode. ANSI était utilisé comme codage par défaut avant Windows 2000. Windows 2000 et les versions plus récentes utilisent Unicode par défaut, mais peuvent toujours exécuter des programmes ANSI.
Pour les programmes Unicode, la page de code est complètement ignorée et
chcp
n'a aucun effet. Il n'est utilisé que par les anciens programmes ANSI qui reposent sur la définition d'une page de code appropriée. Cela n'a plus d'importance pour Unicode, car il est bien défini et prend en charge tout ce qu'un programme raisonnable peut générer.cmd
supporte Unicode, il recevra donc les noms de fichiers déjà en Unicode.Comme vous l'avez déjà découvert, le coupable était la police par défaut. Ce problème est mentionné sur Page Technet sur chcp :
la source