Corriger l’encodage des caractères dans PowerShell

Votre script écrit é ou ? au lieu de é, ou la console affiche du charabia ? Windows PowerShell 5.1 utilise un encodage différent selon la commande. Voici les causes et les bons paramètres, et vous pouvez réparer les fichiers cassés dans le navigateur ci-dessus.

Fonctionne avec du texte et ces fichiers :

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Par exemple des exports Excel, des sauvegardes de bases de données, des sous-titres ou du code de site web.

Réparer

  1. Déposez un fichier ou collez du texte
  2. La réparation est automatique
  3. Copiez ou téléchargez
ou glissez simplement un fichier ici

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.

Un fichier UTF-8 lu avec Get-Content dans PowerShell 5.1

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 UTF8 lit correctement les fichiers UTF-8, même sans BOM.
  • Set-Content, Out-File et Add-Content écrivent en UTF-8 avec -Encoding UTF8, en 5.1 toujours avec un BOM.
  • Export-Csv donnees.csv -Encoding UTF8 -NoTypeInformation au 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.

Autres guides