Intermédiaire • PowerShell 8 min de lecture 25 janvier 2025

PowerShell UTF-8 : encodage, BOM, console et fichiers

Vos accents s'affichent en losanges, vos CSV explosent, un JSON se met à planter sans raison. La cause la plus fréquente sous PowerShell vient d'un encodage inattendu. UTF-8 est la cible, mais encore faut-il la configurer au bon endroit: version, console, redirections, cmdlets et BOM.

Comprendre UTF-8 dans PowerShell

UTF-8 est l'encodage standard du web et des API. Selon la version de PowerShell et le contexte, vos fichiers et flux peuvent partir en UTF-16 LE, CP1252 ou UTF-8 avec/sans BOM.

Les points clés à connaître pour maîtriser UTF-8 :

1 Encodages fréquents sous Windows

Ceux que vous croiserez le plus :

UTF-8 (EF BB BF pour BOM), UTF-8 sans BOM, UTF-16 LE (FF FE), CP1252 (ANSI)

2 Différences de versions PowerShell

Le comportement par défaut change selon la version :

Windows PowerShell 5.1: Out-File/> → UTF-16 LE, encodages historiques
PowerShell 7+: par défaut UTF-8 sans BOM pour fichiers et redirections

3 Cmdlets et paramètres d'encodage

Spécifiez toujours l'encodage quand vous écrivez un fichier :

Set-Content/Out-File/Add-Content -Encoding utf8 | utf8BOM | ascii | unicode
Redirections > et >> suivent la version (UTF-16 LE en 5.1, UTF-8 en 7+)
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'

4 Console, BOM et commandes natives

Les flux console et externes dépendent de ces réglages :

[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)
$OutputEncoding = [Text.UTF8Encoding]::new($false)
chcp 65001 pour une console UTF-8 (CMD/Windows Terminal)

Problèmes classiques

Fichiers écrits en UTF-16 LE par erreur

Windows PowerShell 5.1 avec Out-File ou > produit du UTF-16 LE lu comme binaire ailleurs.

BOM en trop ou manquante

Un BOM UTF-8 casse une API, l'absence de BOM perturbe un outil ancien.

Redirections et pipelines inattendus

Le > en 5.1 écrit en UTF-16 LE, vos scripts shell se retrouvent illisibles.

Outils externes et CP1252

Un exe natif lit/écrit en CP1252 alors que PowerShell produit de l'UTF-8.

Exemple de problème courant :

# Deux fichiers semblent identiques mais pas le même encodage
Set-Content a.txt "café" -Encoding utf8
Set-Content b.txt "café" -Encoding unicode # UTF-16 LE
Compare-Object (Get-Content a.txt -Raw) (Get-Content b.txt -Raw) # ❌ Différents

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git montre tout le fichier comme modifié après une redirection > en 5.1
!
type fichier.txt affiche des carrés ou des zéros (UTF-16 LE pris pour texte)
!
Les accents deviennent é/è (mojibake) dans un CSV ou JSON
!
Une API refuse un JSON à cause d'un BOM UTF-8 en tête
!
La console affiche ? ou � tant que chcp 65001 n'est pas activé

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII met en évidence les caractères non ASCII, la présence de BOM et les symboles problématiques. Idéal pour vérifier qu'un texte destiné à PowerShell, à une API ou à un CSV est bien en UTF‑8 propre.

✅ Détection automatique

BOM UTF-8, UTF-16, CP1252, caractères de contrôle inattendus

📊 Analyse complète

Codes Unicode, positions exactes, normalisation et remplacements

🧹 Nettoyage automatique

Conversion vers UTF-8 sans BOM et ASCII si nécessaire

💾 Export propre

Téléchargement du texte prêt pour PowerShell et pipelines CI

Autres méthodes de détection

Dans l'éditeur

Affichez l'encodage du fichier et forcez "UTF-8" (sans BOM de préférence)
Activez "render whitespace" et la détection de BOM/fin de ligne

En console PowerShell

# Voir les premiers octets (BOM éventuel)
Get-Content .\fichier.txt -Encoding Byte -TotalCount 3 | ForEach-Object { '{0:X2}' -f $_ }
# Écrire explicitement en UTF-8 (sans BOM)
Set-Content .\data.json -Value $json -Encoding utf8
# Forcer l'encodage par défaut des cmdlets de sortie
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
# Console et processus externes en UTF-8
[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false); $OutputEncoding = [Text.UTF8Encoding]::new($false)

En code

PowerShell

[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false); $OutputEncoding = [Text.UTF8Encoding]::new($false)

C# (.NET)

File.WriteAllText(path, text, new System.Text.UTF8Encoding(false));

CMD / Batch

chcp 65001 & powershell -NoProfile -File script.ps1

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Vérifiez que vos contenus sont bien en UTF-8 sans BOM avant de les écrire avec PowerShell. Clean ASCII détecte les anomalies et prépare un texte propre.

Détection de BOM et encodages exotiques
Nettoyage vers UTF-8 sans BOM
Export immédiat pour Set-Content

Méthodes techniques avancées

🔧 Normaliser

Appliquez la normalisation Unicode (NFC/NFKC) côté .NET si nécessaire
Supprimez le BOM quand l'outil cible ne le supporte pas (utf8 sans BOM)
Uniformisez fins de ligne (gitattributes, EditorConfig, dos2unix)

🧹 Filtrer

Spécifiez toujours -Encoding utf8/utf8BOM pour Set-Content, Out-File, Export-*
Convertissez les guillemets typographiques CP1252 en ASCII si requis
Bloquez les caractères de contrôle non imprimables dans vos sorties

⚙️ Automatiser

Définissez $PSDefaultParameterValues pour forcer 'utf8' partout
Ajoutez des tests Pester qui vérifient l'absence de BOM et l'UTF-8
.editorconfig: charset = utf-8 et gitattributes pour homogénéiser

Checklist rapide

PowerShell 7+ par défaut, sinon forcer -Encoding
$PSDefaultParameterValues['Out-File:Encoding']='utf8'
Éditeur configuré en "UTF-8 (sans BOM)" par défaut
Console/output UTF-8: chcp 65001, $OutputEncoding, OutputEncoding
CI: vérification d'absence de BOM et de fichiers UTF-16
Documentation d'équipe sur encodages et redirections PowerShell

Conclusion

UTF-8 sous PowerShell est simple une fois les points de friction identifiés: version, BOM, console, cmdlets et redirections.

En fixant l'encodage explicitement et en automatisant les contrôles, vous éliminez la plupart des soucis de CSV, JSON et logs.

Validez vos textes pour PowerShell UTF-8

Utilisez notre outil pour vérifier BOM, encodage et caractères non ASCII avant d'écrire vos fichiers.

Analyser mon texte