Comment savoir quel encodage utilise un nom de fichier?

1

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.

DVK
la source
Note latérale: Après avoir approfondi mes recherches, je me suis rendu compte que mon problème découlait non seulement de la page de code, mais aussi du fait que je n'utilisais pas la police Lucida Console (mais la police raster). Lorsque j'ai changé la police en Lucida Console et chcp en Unicode (65001), les noms de fichiers étaient correctement affichés. C'était donc bien Unicode ... mais ma question initiale est toujours d'actualité: comment puis-je lire l'encodage? sans pour autant deviner accidentellement la page de code correcte.
DVK

Réponses:

2

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 :

Seule la page de codes du fabricant d'équipement d'origine (OEM) installée avec Windows XP apparaît correctement dans une fenêtre d'invite de commande utilisant des polices Raster. Les autres pages de code apparaissent correctement en mode plein écran ou dans les fenêtres d'invite de commande utilisant des polices TrueType.

gronostaj
la source