Normalisation Unicode : fichier Mac introuvable sur Windows
Le fichier est bien là, dans l'Explorateur de fichiers. Un double-clic, et il s'ouvre. Mais dès que vous tapez son nom dans une commande, un script, un lien hypertexte Excel, une tâche planifiée ou la barre d'adresse, Windows répond « Le système ne trouve pas le fichier spécifié ». Quand le fichier vient d'un Mac et que son nom contient un accent, une cédille ou un caractère non latin, la cause est presque toujours la normalisation Unicode : macOS enregistre souvent les noms de fichiers sous une forme décomposée (NFD), alors que tout ce que vous tapez sur Windows est en forme composée (NFC). Les deux s'affichent exactement pareil à l'écran, mais ce sont des suites de caractères différentes, et Windows ne les considère pas comme le même nom. La solution consiste à renommer le fichier pour que son nom utilise la forme composée, soit avec une courte commande PowerShell, soit avec un outil qui tourne dans le navigateur. Cet article détaille les deux méthodes.
Pourquoi la normalisation Unicode casse les noms de fichiers entre Mac et Windows
Unicode offre deux façons d'écrire la plupart des lettres accentuées. Le é peut être un seul point de code (U+00E9, forme « composée », dite NFC), ou bien un e ordinaire suivi d'un accent combinant séparé (U+0065 + U+0301, forme « décomposée », dite NFD). Même chose pour le ç : un seul caractère, ou un c suivi d'une cédille combinante. À l'écran, les deux donnent é et ç. Le correcteur orthographique les accepte tous les deux. À l'œil nu, impossible de faire la différence.
Les systèmes de fichiers, eux, la font. Windows (NTFS) compare les noms de fichiers caractère par caractère. Il ignore les différences de majuscules et de minuscules, mais il ne traite pas é et e + ◌́ comme équivalents. Si un fichier nommé devis_Hélène.pdf a été créé sur un Mac et enregistré sous la forme devis_He + ◌́le + ◌̀ne.pdf, et que vous tapez devis_Hélène.pdf sur un clavier Windows, vous demandez un nom qui n'existe pas sur ce disque.
Historiquement, macOS a privilégié la forme décomposée. L'ancien système de fichiers HFS+ convertissait systématiquement les noms en NFD, et de nombreuses applications et outils de copie Mac produisent encore des noms NFD aujourd'hui. Quand ces fichiers arrivent sur Windows par clé USB, partage réseau, dossier synchronisé ou pièce jointe, le nom décomposé voyage avec eux, sans modification.
Les caractères concernés :
- les lettres latines avec accents ou signes diacritiques : Hélène, François, Noël, Müller, Łódź
- le hangul coréen, qui se décompose en lettres individuelles (한글 devient ㅎㅏㄴㄱㅡㄹ sur certains affichages)
- les kana japonais avec dakuten ou handakuten (が devient か + ゛)
- le vietnamien, qui empile plusieurs signes sur une même voyelle
Les noms en ASCII pur (rapport_final_v2.pdf) ne sont jamais touchés. C'est ce qui donne au problème un air aléatoire : seuls les fichiers de François, de Noël ou de votre collègue coréenne posent problème.
Vérifier que c'est bien un problème de normalisation Unicode
Avant de renommer quoi que ce soit, assurez-vous que la normalisation est bien en cause, et non une faute de frappe, une espace en fin de nom ou un mauvais dossier. Trois tests rapides :
1. Essayer un joker
Ouvrez le dossier dans PowerShell (clic droit sur le fond du dossier, puis Ouvrir dans le Terminal ou Ouvrir une fenêtre PowerShell ici) et lancez :
Get-ChildItem devis_H*.pdf
Si le joker trouve le fichier mais que le nom complet tapé à la main ne donne rien, le nom contient des caractères différents de ceux que vous avez saisis. C'est la signature de la normalisation.
2. Comparer la longueur
Dans le même dossier :
Get-ChildItem | ForEach-Object { "$($_.Name.Length) $($_.Name)" }
Un nom comme Hélène.pdf devrait compter 10 caractères. Si PowerShell en annonce 12, il y a deux caractères invisibles en trop : les accents combinants qui suivent les e ordinaires.
3. Demander directement à PowerShell
Get-ChildItem | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } | Select-Object Name
Cette commande liste tous les fichiers du dossier dont le nom n'est pas déjà en forme composée. Si votre fichier récalcitrant apparaît, vous avez votre réponse.
Le même décalage se manifeste à d'autres endroits sur Windows, même sans jamais taper de commande :
- Des liens hypertextes Excel ou Word vers des fichiers locaux qui fonctionnaient chez le collègue sur Mac et qui renvoient « Impossible d'ouvrir le fichier spécifié » chez vous.
- Des scripts batch, des sauvegardes ou des outils d'import configurés avec une liste de noms de fichiers.
- « Enregistrer sous » qui propose de créer un second
Hélène.pdfau lieu de demander s'il faut remplacer l'existant. - Une recherche qui ne trouve rien avec le nom exact, alors qu'une recherche partielle sans la lettre accentuée le trouve.
Solution 1 : renommer les fichiers sur Windows avec PowerShell
Si la ligne de commande ne vous fait pas peur, Windows a déjà tout ce qu'il faut. La méthode .NET Normalize('FormC') convertit un nom décomposé en forme composée, et Rename-Item applique le résultat.
-
Ouvrez le dossier concerné dans PowerShell comme indiqué plus haut.
-
Prévisualisez ce qui va changer (rien n'est encore renommé) :
Get-ChildItem -Recurse -File | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } | Select-Object FullName -
Si la liste vous semble correcte, renommez :
Get-ChildItem -Recurse -File | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } | Rename-Item -NewName { $_.Name.Normalize('FormC') } -
Relancez la vérification
-nede la section précédente. Elle ne doit plus rien renvoyer.
Remarques et limites :
-Recurseparcourt aussi les sous-dossiers. Retirez-le si vous ne voulez traiter que le dossier courant. Les noms de dossiers eux-mêmes peuvent être décomposés ; relancez la commande sans-Filepour les attraper, en commençant par les dossiers les plus profonds.- Le renommage s'applique à votre copie. Si les fichiers se trouvent dans un dossier synchronisé (OneDrive, Dropbox, Google Drive), le nouveau nom sera répercuté sur le Mac. C'est en général ce que l'on souhaite, puisque la forme composée fonctionne des deux côtés.
- Un lien ou un script qui référençait l'ancien nom décomposé, copié-collé depuis le Mac, pointera désormais vers un nom qui n'existe plus. En pratique, c'est rare : tout le problème vient justement du fait que les gens tapent la forme composée.
Solution 2 : renommer dans le navigateur, sans ligne de commande
Si PowerShell n'est pas votre tasse de thé, ou si vous avez reçu un mélange de fichiers et d'archives ZIP de plusieurs personnes, l'application web gratuite FilenameFixer fait la même conversion par glisser-déposer.
- Ouvrez l'application web dans Chrome, Edge, Firefox ou Safari.
- Faites glisser les fichiers concernés sur la page. Vous pouvez en déposer tout un lot d'un coup.
- L'outil repère les noms en forme décomposée et affiche la version composée (NFC) qu'il va appliquer.
- Téléchargez les fichiers renommés et remplacez les originaux.
Quelques points utiles à savoir :
- Les fichiers et leurs noms sont traités localement dans votre navigateur. Ils ne sont pas envoyés sur un serveur : un contrat confidentiel nommé
contrat_François.pdfreste sur votre machine. - Si les noms défectueux se trouvent dans un ZIP envoyé par un utilisateur Mac, l'outil de restauration ZIP réécrit les noms à l'intérieur de l'archive (jusqu'à 200 Mo) pour que vous puissiez l'extraire normalement sur Windows.
- Il y a aussi un champ pour le texte collé. Si une collègue vous a transmis une liste de noms de fichiers dans un mail ou un tableur et que vos formules RECHERCHEV n'arrivent pas à les faire correspondre aux fichiers du disque, collez la liste et récupérez la version normalisée.
FilenameFixer ne fait rien que PowerShell ne puisse faire. Il évite simplement d'avoir à connaître la bonne commande, et il gère les archives, ce que l'approche Rename-Item ci-dessus ne fait pas.
Éviter que ça se reproduise
Renommer règle les fichiers d'aujourd'hui. Pour éviter la prochaine fournée :
- Demandez au collègue sur Mac de passer par un formulaire web. De nombreux chemins de téléversement normalisent les noms à l'arrivée, mais pas tous.
- Utilisez l'extension Chrome si vous envoyez des fichiers créés sur Mac vers des applications web. L'extension Chrome FilenameFixer convertit automatiquement les noms en NFC au moment où vous sélectionnez les fichiers dans la boîte de dialogue d'envoi, si bien qu'une GED d'entreprise ou un outil de tickets reçoit directement la forme composée.
- Gardez des noms en ASCII pour les fichiers partagés quand c'est possible.
contrat_francois.pdffonctionne partout sans jamais toucher à ce problème. C'est moins élégant, mais pour tout ce qui est référencé par un script, un lien hypertexte ou une liste d'import, c'est le choix le plus sûr. - Normalisez dans le code. Si vous écrivez un logiciel qui lit des noms de fichiers sur le disque et les compare à une saisie utilisateur, normalisez les deux côtés en NFC avant de comparer. La plupart des langages proposent un appel d'une ligne pour cela (
.Normalize('FormC')en .NET,unicodedata.normalize('NFC', s)en Python,str.normalize('NFC')en JavaScript).
Rien de tout cela n'est un bug de Windows ni un bug de macOS. Les deux systèmes stockent exactement les octets qu'on leur a donnés. Le décalage n'existe que parce que deux orthographes valides de la même lettre se sont retrouvées sur un même disque, et le moyen le plus rapide de clore le débat est de choisir la forme composée et de renommer.