Le problème de fond : chaque commande a son encodage
Dans Windows PowerShell 5.1, presque chaque commande a son propre encodage par défaut : Get-Content lit les fichiers sans BOM en ANSI (Windows-1252), Out-File et > écrivent en UTF-16, Set-Content écrit en ANSI et Export-Csv en ASCII. PowerShell 7 a unifié tout cela et utilise partout UTF-8 sans BOM.
Avant
Utilisateur;Service;Site Renée Dubois;Ventes;Besançon François Lefèvre;Achats;Orléans
Après
Utilisateur;Service;Site Renée Dubois;Ventes;Besançon François Lefèvre;Achats;Orléans
Lire et écrire correctement les fichiers
Get-Content donnees.csv -Encoding UTF8lit correctement les fichiers UTF-8, même sans BOM.Set-Content,Out-FileetAdd-Contentécrivent en UTF-8 avec-Encoding UTF8, en 5.1 toujours avec un BOM.Export-Csv donnees.csv -Encoding UTF8 -NoTypeInformationau lieu du réglage ASCII par défaut, qui remplace les lettres accentuées par?.- Pour toutes les commandes à la fois :
$PSDefaultParameterValues['*:Encoding'] = 'utf8'en tête du script.
Requêtes web avec Invoke-RestMethod et Invoke-WebRequest
Si un serveur n’indique pas de jeu de caractères dans son Content-Type, Windows PowerShell 5.1 décode la réponse en ISO-8859-1. Les réponses UTF-8 contiennent alors é. La solution : récupérer la réponse en octets et la décoder soi-même, par exemple avec [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
Scripts contenant des caractères spéciaux
Si vous enregistrez un script en UTF-8 sans BOM, Windows PowerShell 5.1 le lit comme de l’ANSI. Les caractères d’une chaîne comme Write-Host "Café" s’affichent alors Café. Enregistrez les fichiers .ps1 en UTF-8 avec BOM : dans VS Code via l’encodage de la barre d’état, dans Notepad++ via Encodage → UTF-8-BOM.
La console
Si seule la fenêtre de la console affiche des caractères faux comme ├⌐ à la place de é, le fichier est souvent intact : la console lit l’UTF-8 comme la page de code DOS 437. Changez la sortie avec [Console]::OutputEncoding = [Text.Encoding]::UTF8. Pour ce que vous envoyez à des programmes externes, réglez aussi $OutputEncoding = [Text.Encoding]::UTF8.
Si le fichier a déjà été écrit de travers, déposez-le dans la zone ci-dessus : Mojibuster répare é et consorts et convertit les fichiers ANSI en UTF-8. Si le fichier contient déjà des points d’interrogation, le texte est perdu : voir les points d’interrogation à la place des accents.
Questions fréquentes
Quelle version de PowerShell ai-je ?
$PSVersionTable.PSVersion l’indique. 5.1 est le Windows PowerShell intégré à Windows ; à partir de 7, il s’appelle simplement PowerShell et utilise UTF-8 par défaut.
Pourquoi Excel ouvre-t-il mal mon CSV créé avec PowerShell ?
PowerShell 7 écrit de l’UTF-8 sans BOM, qu’Excel ne reconnaît pas. Utilisez -Encoding utf8BOM ou enregistrez le fichier avec un BOM dans Mojibuster. Plus de détails : Excel affiche des caractères bizarres.
Ai-je besoin de chcp 65001 ?
Seulement pour les programmes qui suivent la page de code de la console. Dans PowerShell, [Console]::OutputEncoding suffit.