2

Context : I am using pg_dump.exe to automate a backup of my PostgreSQL base. I started writing a batch file to be executed in Command Line, but I was struggling to format the current date and time for it to be passed to the name of the backup file. For this reason, I decided to move to PowerShell.

Problem : When I executed pg_dump from command line, the output was correctly printed : my locale is French and you can see on the screenshot below that the output is correctly formatted, more specifically the accented characters such as é, è, etc. are properly printed.

enter image description here

But when doing the same in PowerShell, the accented characters are messed up:

enter image description here

I already switched the PowerShell output encoding to UTF-8 (see my code below), but it doesn't solve the issue.

My code :

#--------------------------------#
# script pour réaliser des sauvegardes automatiques de la base SQL
# Robin Bourgeon octobre 2018
#--------------------------------#
$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

$app = 'C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe'
$args = @('--file=C:\Users\rbourgeon\Desktop\test_backup_psql\backup_test.backup','--format=c','--no-owner','--verbose','--no-privileges','--dbname=base_test_sauvegarde','--host=localhost','--port=5432',
'--username=postgres','--no-password','--role=postgres','--clean','--if-exists')
& $app $args 2>&1 | %{ "$_" }
R. Bourgeon
  • 923
  • 1
  • 9
  • 25

1 Answers1

3

Resources

According to the first thread, the console output is acting a bit strange but here is how to change its encoding:

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("ISO-8859-1")

That being said, it does not necessarily work as expected in the classic PowerShell console as can be seen below.

I would then suggest piping the output to a file and managing the encoding at that point.

[System.IO.File]::WriteAllText("\\path\to\file", $_, [System.Text.Encoding]::GetEncoding("ISO-8859-1"))

This is obviously sub-optimal...

MWE

$Latin1 = [System.Text.Encoding]::GetEncoding("ISO-8859-1")
[Console]::OutputEncoding = $Latin1

$Output = @"
Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et incontestables, tournent toujours au maintien de la Constitution et au bonheur de tous.
"@

Write-Host $Output

[System.IO.File]::WriteAllText("test.txt", $Output, $Latin1)

Output

PowerShell v5

Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et inconOutputables, tournent toujours au maintien de la Constitution et au bonheur de tous.

PowerShell Core v6

Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et incontestables, tournent toujours au maintien de la Constitution et au bonheur de tous.

Output file

Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et incontestables, tournent toujours au maintien de la Constitution et au bonheur de tous.

Akaizoku
  • 456
  • 5
  • 19